3

Android アプリで sqlite を使用しています。データベース ファイルの名前は data.db です。2 つのテーブルがあり、1 つは静的な値 (読み取り専用) で、もう 1 つは動的な値を保存し、アプリを playStore にプッシュしたとします。

次のバージョンでは、data.db を更新し、最初のテーブルの値を更新し、2 番目のテーブルに新しい列を追加し、3 番目の新しいテーブルを追加して、アプリを PlayStore にプッシュしました。ユーザーがアプリを更新しているかどうかを確認する方法と、既存のデータを保存するための最良の方法と、新規インストールではなく更新である場合にプログラムで data.db を更新する方法を教えてください。

4

6 に答える 6

3

SQLiteOpenHelper の onUpgrade メソッドを使用できます。onUpgrade メソッドでは、パラメーターの 1 つとして oldVersion を取得します。

onUpgrade では Switch ケースを使用し、各ケースではバージョン番号を使用して、データベースの新しいバージョンごとに送信されたデータベースの現在のバージョンを追跡します。

oldVersion から newVersion にループ オーバーし、一度に 1 ずつバージョンを増やしてから、データベースを段階的にアップグレードすることをお勧めします。これは、データベース バージョン 1 を使用しているユーザーが久しぶりにアプリをデータベース バージョン 7 を使用するバージョンにアップグレードし、互換性のない変更が原因でアプリがクラッシュし始めた場合に非常に役立ちます。

次に、データベースの更新が段階的に行われ、考えられるすべてのケースがカバーされます。つまり、新しいバージョンごとに行われたデータベースの変更が組み込まれ、アプリケーションのクラッシュが防止されます。

于 2015-03-24T07:20:31.917 に答える
1

2つの方法があります

1] データベースのバージョンを変更して、ユーザーがアプリ メソッドを更新したときSQLiteOpenHelper's onUpgrade()にこのメソッドで実行されるように、テーブルを削除するコードを記述し、新しいスキーマに従って新しいテーブルを作成し、ネットワーク呼び出しを送信してデータを取得できるようにしました。

2]プリインストールされたdbでアプリをプッシュします。db バージョンでデータベースを作成し、assetsフォルダに保存します。アプリが実行されるたびに、アセットのデータベースとアプリのデータベースのバージョンを比較します。アセットのデータベース バージョンがアプリのデータベースよりも新しい場合、これはデータベースを更新する必要があることを意味します。Assete のデータベースをフォルダ ストラクタに直接コピーし、デルタ コールを送信してデータをフェッチします。

于 2015-03-24T05:12:01.380 に答える
1

この例では、新しい列を追加したので、この場合の変更は次のようになります (ここではデータを失うことはありません)。

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    String sql = "ALTER TABLE " + TABLE_SECRET + " ADD COLUMN " +
     "name_of_column_to_be_added" + " INTEGER";
    db.execSQL(sql);        
} 
于 2016-01-26T20:46:57.427 に答える
-1
private static String DB_PATH = Environment.getDataDirectory()+"/data/package-name/databases/";
private static String DB_NAME = "name_of_the_database"; // student.db

private void copyDataBase() throws IOException
{


    // Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);

    // Path to the just created empty d inb
    String outFileName = DB_PATH + DB_NAME;

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) 
    {
        myOutput.write(buffer, 0, length);
    }
    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

    //Copy successful
    outFileName = DB_PATH + DB_SUCCESS;
    myOutput = new FileOutputStream(outFileName);
    myOutput.write(1);
    myOutput.flush();
    myOutput.close();
}
于 2016-05-16T12:59:41.200 に答える
-1

http://www.activeandroid.com/ライブラリを使用することをお勧めします。移行をサポートします。データベースモデルのバージョンのフォルダーに[n].sqlファイルを書き込むだけです。アクティブな android は、既存のバージョンを引き継ぎ、必要な移行を適用します。assets/migrationsn

于 2015-03-24T07:27:39.423 に答える
-2
package com.example.sqllite_db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabseAdapter extends SQLiteOpenHelper

{
    public static String DatabaseName="NewDatabase";
    public static int DatabaseVersion=1;

    public DatabseAdapter(Context context) 
    {
        super(context,DatabaseName,null,DatabaseVersion);
        // TODO Auto-generated constructor stub
    }

    /*public static String TableUser="tb1";
    public static String keyId="id";
    public static String keyName="name";
    public static String keyPass="pass";*/


    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        // TODO Auto-generated method stub
        String createQuery="create table tb1(name text,pass text);";
        db.execSQL(createQuery);
        //String createQuery1="create table tb2(pass text);";//("+keyName+"text,"+keyPass+"text);"; 
        //db.execSQL(createQuery1);


    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
        // TODO Auto-generated method stub
        db.execSQL("drop table tb1");
        onCreate(db);
        //db.execSQL("drop table tb2");
        //onCreate(db);

    }

}

データベースを Upgrade メソッドにドロップしてから、その中で Create メソッドを再度呼び出すと、新しいデータベースをアップロードするとデータベースが更新されます。

于 2015-03-24T05:08:58.937 に答える