sql >> データベース >  >> RDS >> SQLite

オフラインで使用するために解析されたJSONをキャッシュする方法

    次のようなものを使用して、アプリのキャッシュフォルダに保存してみませんか:

    String path = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator;
    File dir = new File(path);
    if (!dir.exists()) {
        dir.mkdirs();
    }
    path += "data";
    File data = new File(path);
    if (!data.createNewFile()) {
        data.delete();
        data.createNewFile();
    }
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data));
    objectOutputStream.writeObject(actorsList);
    objectOutputStream.close();
    

    その後、次を使用していつでも読むことができます:

    List<?> list = null;
    File data = new File(path);
    try {
        if(data.exists()) {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data));
            list = (List<Object>) objectInputStream.readObject();
            objectInputStream.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    

    更新: さて、ObjectToFileUtilという名前のクラスを作成し、このコードを作成したクラスに貼り付けます

    package <yourpackagehere>;
    
    import android.os.Environment;
    
    import java.io.*;
    
    public class ObjectToFileUtil {
    
        public static String objectToFile(Object object) throws IOException {
            String path = Environment.getExternalStorageDirectory() + File.separator + "cache" + File.separator;
            File dir = new File(path);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            path += "data";
            File data = new File(path);
            if (!data.createNewFile()) {
                data.delete();
                data.createNewFile();
            }
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(data));
            objectOutputStream.writeObject(object);
            objectOutputStream.close();
            return path;
        }
    
        public static Object objectFromFile(String path) throws IOException, ClassNotFoundException {
            Object object = null;
            File data = new File(path);
            if(data.exists()) {
                ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(data));
                object = objectInputStream.readObject();
                objectInputStream.close();
            }
            return object;
        }
    }
    

    をパッケージ名に変更し、 WRITE_EXTERNAL_STORAGEを追加することを忘れないでください AndroidManifest.xmlへのアクセス許可 。 MainActivityの追加フィールド

    private String dataPath;
    

    JSONAsyncTaskクラスのonPostExecuteメソッドを

    に置き換えます
    protected void onPostExecute(Boolean result) {
        dialog.cancel();
        adapter.notifyDataSetChanged();
        if(result) {
            try {
                dataPath = objectToFile(arrayList);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();
        }
    }
    

    を使用して、いつでもファイルからgetactorsListにアクセスできるようになりました。
    try {
        actorsList = (ArrayList<Actors>)objectFromFile(dataPath);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    

    アプリケーションを閉じた後にファイルのパスを保存する場合は、たとえばSharedPreferencesを使用して、dataPath文字列を保存する(およびアプリケーションの起動時にロードする)必要があります。



    1. なぜJOIN句とWHERE条件を使用するのですか?

    2. デフォルトとしてマークされた1つのレコードのみの制約

    3. TIMESTAMP列から日付/時刻情報を取得するにはどうすればよいですか?

    4. 最適化フェーズと逃した機会