web-dev-qa-db-ja.com

jsonをキャッシュするための最良の方法

私のアプリケーションは、オンラインだけでなくオフラインモードでも動作するはずです。そのため、データをキャッシュするための最良の方法を見つけることを検討しています。データの保存にSharedPreferenceを使用するのは好きではありませんが、Androidドキュメントに記載されています。設定値に使用できる文字の最大サイズは8192です。これで問題ないかどうかわかりませんか?合格しようとしました。 FileCashingまたはsqLiteキャッシングを使用しようとするこのアイデアから。

では、SharedPreferenceとFileCashing、またはSqLiteCachingのどちらが最適だと思いますか?

15
fish40

私は個人的にこれを次のようにするのが好きです。コンテンツを保持できるSQLiteデータベースを作成します。次に、UIが自動的に更新されるように、データが変更されるたびに通知を送信するアダプターとコンテンツプロバイダーを使用して、ユーザーインターフェイスをデータベースに直接バインドします。方程式の最後の部分は、コンテンツをダウンロードしてデータベースに非同期で保存する、ある種の同期サービスです。そうすれば、データがすべて同じ場所にあるため、データを非常に簡単に管理できます。アプリについて把握する必要がある唯一の部分は、データベースからデータを更新または削除するタイミングを決定する方法です。

アダプター

ContentProvider

同期

13
metter

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();
19
fida1989

私は内部ストレージファイルを保存するアプリケーションパッケージディレクトリを使用しましたが、ルート化されていないデバイスからはアクセスできません。

ここでは、ファイルを作成、読み取り、削除できるクラスです。

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();
0
Pankaj

要件に基づいて、SQLiteデータベースをお勧めします。

共有設定は構成ストレージに適しているため、多くの場合、小さなデータ/文字列です。

ファイルキャッシュは管理が難しいので、SQLiteをお勧めします-管理が簡単で、大量のデータを保存する機能です。

パフォーマンスを考慮すると、インデックスの数がそれほど多くない場合、SQLiteデータベースは許容できるパフォーマンスを備えているはずです。例えば。ファイルキャッシュよりもわずか数ミリ秒遅い。

これらの2つのアプローチを組み合わせることができる場合があります。 SQLiteに保存されているインデックスオフセット付きのランダムアクセスファイルを使用します。

0
Robin