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

事前入力されたデータベースの更新

    Gabe Sechanからのコメントによると、最も簡単な方法は、アプリが起動するたびにアセットフォルダーからデータベースをコピーすることです。つまり、変更します:-

    private void createDB(){
        boolean dbExist = DBExists();
    
        if(!dbExist){
            this.getReadableDatabase();
            copyDBFromResource();
    
        }
        dbSglite=getReadableDatabase();
    }
    

    to:-

    private void createDB(){
        copyDBFromResource();
        dbSglite=getReadableDatabase();
    }
    

    コメントすることに懸念があるようです

    「アクティビティが開始されるたびにDBをコピーしませんか。」

    そうです (それは悪いことでしょうか?-レトリック )。

    ただし、データベースバージョンを利用する場合、つまり、アセットフォルダ内のバージョンを現在のバージョンと照合するとします。基本的には、アセットフォルダからデータベースにアクセスする必要があるため、あるデータベースを別のデータベースと照合します(少なくともデータベースを開きます)。したがって、まだいくつかのオーバーヘッドがあります。

    それほど集中的でない可能性のあるオプションは、アセットファイルの最終変更を確認することです。 共有設定で最後にコピーされたアセットファイルの日付に対する日付。 (File lastModified メソッド)ファイル-lastModified。

    同様の見方で、別のオプションは、パッケージのバージョンを確認することです。 最後に実装されたものに対して、再び共有設定に保存されます。PackageInfo-versionCode。

    もちろん、これらのオプションの両方で、アセットファイルからデータベースを置き換えることは、違いがある(増加する)場合にのみ発生します。

    パッケージバージョンの使用例

    次の例( dbHelper内のすべての変更 class)は、パッケージバージョンが増加した場合(またはデータベースが存在しない場合)にアセットからデータベースをコピーします:-

    class dbHelper extends SQLiteOpenHelper {
    
    
        private static final String DATABASE_NAME = "questions.db";
        private  static final int SCHEMA_VERSION = 1;
        private static  final String SHARED_PREFS = "shared_prefs";
        private static final String SHARED_PREFKEY_QUESTIONSDBLASTUPDATED = "spkey_qdblastupdated";
    
        public SQLiteDatabase dbSglite;
        private String mDBPath;
    
        private final Context myContext;
    
        public dbHelper(Context context) {
            super(context, DATABASE_NAME, null, SCHEMA_VERSION);
            this.myContext=context;
            this.mDBPath=context.getDatabasePath(DATABASE_NAME).getParent();
        }
    
        @Override
        public void onCreate(SQLiteDatabase db){
            Log.d("ONCREATE","OnCreate Method Called.");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        public void createDatabase(){
            createDB();
        }
    
        private void createDB(){
    
            if (isQuestionsDBNew() || (!DBExists())) {
                Log.d("COPYFROMASSET", "Copying Questions From Assets");
                copyDBFromResource();
                setQuestionsDBNew(getPackageVersion());
            } else {
                Log.d("COPYFROMASSET",
                        "Questions not copied from Assets - New Questions Check result was " +
                                Boolean.toString(isQuestionsDBNew()) +
                                " DB Exists result was " + Boolean.toString(DBExists())
                );
            }
            dbSglite=getReadableDatabase();
        }
    
        private boolean DBExists(){
    
            SQLiteDatabase db = null;
    
            try {
                String databasePath = myContext.getDatabasePath(DATABASE_NAME).getPath();
                db = SQLiteDatabase.openDatabase(databasePath,null, SQLiteDatabase.OPEN_READWRITE);
                db.setLocale(Locale.getDefault());
                db.setLockingEnabled(true);
                db.setVersion(1);
            } catch (SQLiteException e) {
    
                Log.e("SqlHelper", "database not found");
            }
    
            if (db != null) {
                db.close();
            }
            return db != null;
    
        }
    
        private void copyDBFromResource() {
            InputStream inputStream = null;
            OutputStream outputStream = null;
    
            try {
                inputStream = myContext.getAssets().open(DATABASE_NAME);
                File databasedir = new File(myContext.getDatabasePath(DATABASE_NAME).getParent());
                databasedir.mkdirs();
                outputStream = new FileOutputStream(mDBPath+"/"+DATABASE_NAME);
                byte[] buffer = new byte[1024];
                int length;
                while ((length=inputStream.read(buffer))>0){
                    outputStream.write(buffer, 0, length);
                }
    
                outputStream.flush();
                outputStream.close();
                inputStream.close();
    
            } catch (IOException e) {
                e.printStackTrace();
                throw new Error("Problem copying database.");
            }
    
        }
    
        public void openDataBase() throws SQLException {
            String myPath = myContext.getDatabasePath(DATABASE_NAME).getPath();
            dbSglite = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READWRITE);
    
        }
    
        private boolean isQuestionsDBNew() {
            SharedPreferences prefs = myContext.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE);
            long stored_lastused = prefs.getLong(SHARED_PREFKEY_QUESTIONSDBLASTUPDATED,-1);
            Log.d("NEWQUESTIONS?", "Result of testing package version " +
                    String.valueOf(stored_lastused) +
                    " against " +
                    String.valueOf( getPackageVersion()) +
                    " was " + String.valueOf(stored_lastused < getPackageVersion()));
            return  (stored_lastused < getPackageVersion());
        }
    
        private long getPackageVersion() {
            PackageInfo pi;
            try {
                pi = myContext.getPackageManager().getPackageInfo(myContext.getPackageName(),0);
            } catch (PackageManager.NameNotFoundException e) {
                return -1;
            }
            Log.d("PACKAGEVERSION", "The version of package " +
                    myContext.getPackageName() +
                    " was " +
                    String.valueOf(pi.versionCode)
            );
            return pi.versionCode;
        }
    
        private void setQuestionsDBNew(long lastused) {
            SharedPreferences.Editor editor = myContext.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).edit();
            editor.putLong(SHARED_PREFKEY_QUESTIONSDBLASTUPDATED,lastused);
            editor.apply();
        }
    }
    

    メモ

    • コードは、質問のコードに非常に基づいています。あります:-
      • 共有設定を処理するための2つの追加のクラス変数(定数)。
      • 3つの新しい方法:-
      • isQuestionsDBNew これは、パッケージのバージョンが共有設定のバージョンストアよりも大きい場合にtrueを返します(共有設定のいずれも-1になることはないため、どのパッケージバージョンよりも小さい必要があります)。
      • getPackageVersion パッケージバージョンをlongとして返します。
      • setQuestionsDBNew 該当する共有設定を更新します。
      • createDBを変更して、パッケージバージョンの変更を確認し、アセットからデータベースをコピーします。データベースが存在するかどうかを確認するための追加のチェックがありますが、これはデータベースファイルのみが削除された場合にのみ必要になります。アプリのデータを削除すると、共有設定が削除されるため、データベースがコピーされます。
    • コードには、私が残した診断ログが含まれています。
    • これは広範囲にテストされていません(つまり、パッケージバージョンを増やすほどには行っていません)。

    例からの出力-インストールされているアプリ:-

    01-05 19:46:44.849 26692-26692/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    01-05 19:46:44.850 26692-26692/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    01-05 19:46:44.850 26692-26692/m.com.so48103235_updateprepopdb D/NEWQUESTIONS?: Result of testing package version -1 against 1 was true
    01-05 19:46:44.850 26692-26692/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    01-05 19:46:44.850 26692-26692/m.com.so48103235_updateprepopdb D/COPYFROMASSET: Copying Questions From Assets
    01-05 19:46:44.855 26692-26692/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    

    例からの出力-後続の実行:-

    01-05 19:48:10.375 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    01-05 19:48:10.376 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    01-05 19:48:10.376 26755-26755/m.com.so48103235_updateprepopdb D/NEWQUESTIONS?: Result of testing package version 1 against 1 was false
    01-05 19:48:10.376 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    01-05 19:48:10.381 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    01-05 19:48:10.381 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    01-05 19:48:10.381 26755-26755/m.com.so48103235_updateprepopdb D/NEWQUESTIONS?: Result of testing package version 1 against 1 was false
    01-05 19:48:10.382 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
    01-05 19:48:10.387 26755-26755/m.com.so48103235_updateprepopdb D/COPYFROMASSET: Questions not copied from Assets - New Questions Check result was false DB Exists result was true
    
    • ログメッセージを追加するメソッドを呼び出してデータベースが再度コピーされなかったことを報告するときに使用されるより広範なメッセージによる追加メッセージ。



    1. mysql_num_rows():指定された引数は有効なMySQL結果リソースではありません

    2. 拡張機能を作成しようとしたときのPostgreSQLエラー

    3. CSVファイルをSQLiteテーブルにインポートする

    4. SQLにパラメーターを渡すこととは何ですか?なぜそれが必要なのですか?