android - 应用程序如何保存数据

标签 android libgdx saving-data

这可能是一个愚蠢的问题,也可能是重复的。但是,我真的不知道,也根本找不到解决办法。我的问题是,应用程序如何保存数据。我正在为 Android 设备使用 LibGDX 和 Java 制作一个应用程序,我只是在思考这个问题。例如,当我关闭 Candy Crush 并在第二天重新打开它时,它是如何记住我所在的位置的,即使应用程序已重置?如果这确实是重复的,我会非常感谢其他论坛,并为重复道歉。我只是没能找到一个。提前致谢!

最佳答案

这是一个广泛的问题,但我试图涵盖有关该主题的 View 元素。如果您未注册或未将您的帐户与 Facebook 等网站相关联并重新安装该应用程序,Candy Crush Sage 会自行重置。他们很可能使用数据库来存储东西。如果你没有注册,东西可能只是存储在本地。

LibGDX 提供了一个方便的功能来在本地存储数据。它称为首选项,您只需写入它,下次打开您的应用程序时它就会保留。

Preferences pref = Gdx.app.getPreferences("somefile");
pref.putString("name", "Menyo");
pref.putInteger("level", 20);

然而,当您卸载时,这些数据会随之消失,对于喜欢“调查”的玩家来说,它也不是很安全。除此之外,您可以将自己创建的数据存储在某个地方。如果您将它存储在内部应用程序之外,即使在删除应用程序后它仍然存在,并且只要数据保留并且您的应用程序在重新安装后看起来在同一位置,您就应该能够检索数据。但正如您所料,这也不是万无一失的。

确保的唯一真正方法是拥有某种登录机制。最可行的方法是数据库。我现在有一个类似的系统在运行,但在客户端和数据库之间有一个服务器。您可以将任何数据存储在数据库中,并通过他的 ID 将其链接到玩家。

  • 新玩家可以选择以访客身份玩游戏。这将创建一个名称为 "Guest"+ id 的新帐户。当玩家将其帐户链接到诸如 Facebook 或电子邮件地址之类的内容时,该帐户将持续存在,与之关联的数据也会如此。

  • 现有玩家将在安装您的应用时登录,您可以将登录信息存储在该设备上,以便他们在该数据存在且有效时自动登录。

    <

要设置数据库,我强烈建议永远不要通过客户端设备直接连接到数据库。要么有一个网络服务,要么就像我目前正在做一个 KryoNet 服务器。这里的原因是您需要清理来自客户端的数据。您可以从客户端设备执行此操作,但您无法完全控制它。始终在服务器端对用户输入进行清理。

如果您了解一点 PHP 和 mysql,创建一个通过数据库连接的 Web 服务是非常容易的。您只需向该 php 页面发送一个 HttpRequest 并让它完成工作即可。

public class WebTest {
    HttpRequestBuilder builder;
    Net.HttpRequest request;

    public WebTest()
    {
        builder = new HttpRequestBuilder();
        request = builder.newRequest().method(Net.HttpMethods.GET).url("http://yourdomain.com/script.php").build();
        request.setHeader("Content-Type", "application/x-www-form-urlencoded");


        final long start = System.nanoTime();
        Gdx.net.sendHttpRequest(request, new Net.HttpResponseListener() {
            @Override
            public void handleHttpResponse(Net.HttpResponse httpResponse) {
                Gdx.app.log("Test", "HTTP Response code: " + httpResponse.getStatus().getStatusCode());
                Gdx.app.log("Test", "HTTP Response code: " + httpResponse.getResultAsString());
                Gdx.app.log("Test", "Response time: " + ((System.nanoTime() - start) / 1000000) + "ms");
            }

            @Override
            public void failed(Throwable t) {
                Gdx.app.log("Test", "HTTP request failed");
            }

            @Override
            public void cancelled() {
                Gdx.app.log("Test", "HTTP request cancelled");
            }
        });
    }
}

将名为 script.php 的 php 脚本放入 yourdomain.com 并在其中回显一些内容。然后这段代码应该会在您的应用程序中收到该回显。

您还可以创建 xml 并使用您喜欢的解析器对其进行解析。但是您必须设置请求的 header 才能正确接收 xml。

request.setHeader("Content-Type", "text/xml");

这是一个以 XML 格式发送反馈的 PHP MySQL 连接。

<?php
$link = mysqli_connect("127.0.0.1", "root", "", "chatapp");
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><mysql></mysql>");
if (!$link)
{
    $xml->addChild("error", "Error: Unable to connect to MySQL.");
    $xml->addChild("error", "Debugging errno: " . mysqli_connect_errno());
    $xml->addChild("error", "Debugging error: " . mysqli_connect_error());
    exit;
}

$xml->addChild("success", "Success: A proper connection to MySQL was made!");
$xml->addChild("success", "Host information: " . mysqli_get_host_info($link));

//Sends the xml to whoever requested this
print($xml->asXML());

mysqli_close($link);
?>

现在您可以简单地使用 PHP 将用户登录到数据库,就像您在普通网页上所做的那样。有很多 php 教程涵盖了这个主题。当然,您可以为此使用任何服务器端脚本。

您自己的服务器也可以连接到数据库,但需要做更多的工作。但是 KryoNet 需要你做很多工作。您自己的服务器确实意味着您可以在服务器上存储数据并通过 TCP 或 UDP 连接非常快速地交换这些数据。您基本上可以更好地控制所交换的内容。

关于android - 应用程序如何保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32621637/

相关文章:

android - Android平台中的Service vs IntentService

java - libgdx 在触摸位置绘制图像

java - 如何结合Scene2d和Bullet?

swift - 如何在 Firebase 上将我的变量正确设置为一个值而不让它重置进度?

android - 定义宏以在android中使用文件和行记录错误

android - 带参数的 onBackPressed()

java - 如何在 Android 的 TextView 中随机设置文本?

java - 如何在 Libgdx 中对汽车施加制动

java - 如何将自定义数据保存到文本文件?

python-3.x - 当我将 DataFrame 保存为 CSV 时,Pandas 更改数字(python3)