SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Memperbarui database yang sudah terisi sebelumnya

Sesuai komentar dari Gabe Sechan, metode paling sederhana adalah menyalin db dari folder aset setiap kali Aplikasi dimulai, yaitu mengubah :-

private void createDB(){
    boolean dbExist = DBExists();

    if(!dbExist){
        this.getReadableDatabase();
        copyDBFromResource();

    }
    dbSglite=getReadableDatabase();
}

ke :-

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

Anda tampaknya memiliki kekhawatiran untuk berkomentar

"Bukankah itu akan menyalin DB setiap kali aktivitas dimulai."

ya akan (Apakah itu seburuk itu? - retoris ).

Namun, katakanlah Anda menggunakan Versi Basis Data yaitu memeriksa versi di folder aset dengan versi saat ini. Pada dasarnya Anda masih perlu mengakses database dari folder aset, jadi Anda akan memeriksa satu database dengan database lain (setidaknya membukanya). Jadi masih ada beberapa biaya tambahan.

Opsi yang mungkin kurang intensif adalah memeriksa terakhir diubah . file aset tanggal terhadap tanggal file aset yang terakhir disalin dalam preferensi bersama. (File lastModified metode) File - lastModified.

Opsi lain, dalam tampilan serupa, adalah memeriksa versi paket terhadap implementasi terakhir, disimpan lagi di preferensi bersama.PackageInfo - versionCode.

Tentu saja pada kedua opsi tersebut, penggantian database dari file assets hanya terjadi bila ada perbedaan (kenaikan).

Contoh menggunakan Versi Paket

Contoh berikut (semua perubahan dalam dbHelper class) akan menyalin Database dari aset jika versi paket ditingkatkan (atau jika Database tidak ada):-

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();
    }
}

Catatan

  • Kode ini sangat didasarkan pada kode dari pertanyaan. Ada :-
    • Dua variabel kelas tambahan (konstanta) untuk penanganan preferensi bersama.
    • Tiga metode baru :-
    • isQuestionsDBNew yang mengembalikan true jika versi paket lebih besar dari penyimpanan versi di preferensi bersama (tidak ada dalam preferensi bersama yang menghasilkan -1, jadi harus lebih kecil dari versi paket apa pun).
    • getPackageVersion mengembalikan versi paket sebagai long.
    • setQuestionsDBNew yang memperbarui preferensi bersama yang berlaku.
    • Perubahan pada createDB untuk memeriksa perubahan versi paket dan kemudian menyalin database dari aset. Ada pemeriksaan tambahan untuk melihat apakah database ada, meskipun ini hanya diperlukan jika hanya file database yang dihapus. Menghapus data Aplikasi akan menghapus preferensi bersama sehingga database disalin.
  • Kode ini menyertakan beberapa log diagnostik yang saya tinggalkan.
  • Ini belum diuji secara ekstensif (yaitu saya belum meningkatkan versi paket).

Output dari contoh - Aplikasi sedang diinstal :-

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

Keluaran dari contoh - Jalankan Selanjutnya :-

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
  • Pesan tambahan karena pesan yang lebih luas digunakan saat melaporkan bahwa database tidak disalin metode panggilan lagi yang menambahkan pesan log.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tweak Hasil Avg() Anda dalam SQLite dengan Kata Kunci BERBEDA

  2. Gabung Kiri SQLite

  3. Mengakses database satu aplikasi dari aplikasi lain

  4. Android - SQLite - PILIH ANTARA Tanggal1 DAN Tanggal2

  5. Android sqlite db.query mengarah ke CursorIndexOutOfBoundsException