sql >> Database teknologi >  >> RDS >> SQLite

Opdatering af en forududfyldt database

Ifølge kommentaren fra Gabe Sechan ville den enkleste metode være at kopiere db'en fra aktivemappen hver gang appen startes, det vil sige at ændre :-

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

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

    }
    dbSglite=getReadableDatabase();
}

til :-

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

Du er tilsyneladende bekymret for at kommentere

"Ville det ikke kopiere DB hver gang aktivitet startes."

ja det ville det (vil det være så slemt? - retorisk ).

Sig dog, at du skulle bruge databaseversionen, dvs. kontrollere versionen i aktivmappen mod den aktuelle version. Du har stadig grundlæggende brug for at få adgang til databasen fra aktivmappen, så du ville kontrollere en database mod en anden (i det mindste åbne dem). Så der ville stadig være nogle faste omkostninger.

En mulighed, der kan være mindre intensiv, ville være at kontrollere aktivfilens sidst ændrede dato i forhold til datoen for den sidst kopierede aktivfil i delte præferencer. (File lastModified metode) Fil - lastModified.

En anden mulighed, i en lignende visning, ville være at tjekke pakkens version mod den sidst implementerede, igen gemt i delte præferencer.PackageInfo - versionCode.

I begge disse muligheder sker udskiftning af databasen fra aktivfilen naturligvis kun, når der er en forskel (forøgelse).

Eksempel ved brug af pakkeversion

Følgende eksempel (alle ændringer i dbHelper klasse) vil kopiere databasen fra aktiverne, hvis pakkeversionen øges (eller hvis databasen ikke eksisterer) :-

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

Bemærkninger

  • Koden er i høj grad baseret på koden fra spørgsmålet. Der er :-
    • To ekstra klassevariabler (konstanter) til håndtering af delte præferencer.
    • Tre nye metoder:-
    • isQuestionsDBNew der returnerer sandt, hvis pakkeversionen er større end versionslagret i delte præferencer (intet i delte præferencer resulterer i -1, så bør være mindre end enhver pakkeversion).
    • getPackageVersion returnerer pakkeversionen som en lang.
    • setQuestionsDBNew som opdaterer den gældende delte præference.
    • Ændringer i createDB'en for at tjekke for pakkeversionsændringen og derefter kopiere databasen fra aktiverne. Der er en ekstra kontrol for at se, om databasen eksisterer, selvom dette kun ville være nødvendigt, hvis blot databasefilen blev slettet. Sletning af appens data ville slette de delte præferencer, så det resulterer i, at databasen bliver kopieret.
  • Koden inkluderer noget diagnostisk logning, som jeg har efterladt.
  • Dette er ikke blevet grundigt testet (dvs. jeg er ikke gået så langt at øge pakkeversionen).

Output fra eksemplet - App installeres :-

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

Output fra eksemplet - Efterfølgende kørsel :-

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
  • Ekstra meddelelser på grund af den mere omfattende meddelelse, der blev brugt til at rapportere, at databasen ikke blev kopieret, kalder metoder igen, som tilføjer logbeskeder.



  1. Efter gendannelse af min database fjernet serien fra kolonnen i Postgresql

  2. Udfordringen er i gang! Fællesskabsopfordring til at skabe den hurtigste nummerseriegenerator

  3. Brug af MariaDB Audit Plugin til databasesikkerhed

  4. Oprettelse af funktioner i phpMyAdmin - Fejl:adgang nægtet, du har brug for superprivilegiet til denne handling