15

我的应用程序不仅可以在线工作,还可以离线工作。出于这个原因,我正在考虑找到兑现数据的最佳方式。我不喜欢使用 SharedPreference 来存储数据,但在 android 文档中写入了首选项值允许的最大字符大小为 8192。我不知道这是否可以?我试图通过尝试使用 FileCashing 或 sqLite 兑现来放弃这个想法。

那么你们认为什么是最好的 SharedPreference vs FileCashing 或 vs SqLiteCaching?

4

4 回答 4

20

将缓存目录中的 json 保存为文件....

节省:

// Instantiate a JSON object from the request response
JSONObject jsonObject = new JSONObject(json);
// Save the JSONOvject
ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File(getCacheDir(),"")+"cacheFile.srl"));
out.writeObject( jsonObject );
out.close();

取回:

// Load in an object
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(new File(getCacheDir(),"")+"cacheFile.srl")));
JSONObject jsonObject = (JSONObject) in.readObject();
in.close();
于 2013-08-29T09:34:32.097 回答
13

我个人喜欢通过以下方式做到这一点。创建一个可以保存您的内容的 SQLite 数据库。然后,使用 Adapters & Content Providers 将用户界面直接绑定到数据库,只要数据发生更改,就会发送通知,以便 UI 可以自行更新。等式中的最后一部分是某种形式的同步服务,它可以异步下载内容并将其保存到数据库中。这样,您可以非常轻松地管理您的数据,因为它们都在同一个地方。您必须为您的应用弄清楚的唯一部分是如何决定何时更新或删除数据库中的数据。

适配器

内容提供商

同步

于 2013-08-29T09:03:56.900 回答
0

根据您的要求,我会推荐 SQLite 数据库。

由于共享首选项适用于配置存储 - 通常是小数据/字符串。

文件缓存很难管理,所以我推荐 SQLite - 易于管理和存储海量数据的能力。

考虑到性能,如果索引的数量不是很大,SQLite 数据库应该有可以接受的性能。例如,仅比文件缓存慢几毫秒。

您也许可以将这两种方法结合在一起。使用存储在 SQLite 中的具有索引偏移量的随机访问文件。

于 2013-08-29T09:03:11.387 回答
0

我使用了内部存储,它将文件存储在应用程序包目录中,非根设备无法访问。

这里是可以创建、读取和删除文件的类

public class ReadWriteJsonFileUtils {
    Activity activity;
    Context context;

    public ReadWriteJsonFileUtils(Context context) {
        this.context = context;
    }

    public void createJsonFileData(String filename, String mJsonResponse) {
        try {
            File checkFile = new File(context.getApplicationInfo().dataDir + "/new_directory_name/");
            if (!checkFile.exists()) {
                checkFile.mkdir();
            }
            FileWriter file = new FileWriter(checkFile.getAbsolutePath() + "/" + filename);
            file.write(mJsonResponse);
            file.flush();
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String readJsonFileData(String filename) {
        try {
            File f = new File(context.getApplicationInfo().dataDir + "/new_directory_name/" + filename);
            if (!f.exists()) {
                onNoResult();
                return null;
            }
            FileInputStream is = new FileInputStream(f);
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            return new String(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
        onNoResult();
        return null;
    }

    public void deleteFile() {
        File f = new File(context.getApplicationInfo().dataDir + "/new_directory_name/");
        File[] files = f.listFiles();
        for (File fInDir : files) {
            fInDir.delete();
        }
    }

    public void deleteFile(String fileName) {
        File f = new File(context.getApplicationInfo().dataDir + "/new_directory_name/" + fileName);
        if (f.exists()) {
            f.delete();
        }
    }
}

您可以通过调用ReadWriteJsonFileUtils类方法来创建、读取和删除文件,如下所示:

用于创建文件:

try {
    new ReadWriteJsonFileUtils(context).createJsonFileData(file_name, data);
} catch (Exception e) {
    e.printStackTrace();
}

对于读取文件:

String jsonString = new ReadWriteJsonFileUtils(context).readJsonFileData(file_name);

用于删除单个文件

new ReadWriteJsonFileUtils(context).deleteFile(file_name);

用于删除所有文件

new ReadWriteJsonFileUtils(context).deleteFile();
于 2016-03-19T20:27:50.500 回答