在商店中发布新版本的Android应用程序时更新SQLite数据库

时间:2015-03-24 03:56:15

标签: android sqlite updates sqliteopenhelper android-database

我在我的Android应用程序中使用sqlite,我的数据库文件名为data.db.假设我有两个表,其中一个是静态值(只读),第二个是保存动态值并将应用程序推送到playStore。

在下一个版本中,我更新了data.db,我更新了第一个表中的值,在第二个表中添加了新列,并添加了第三个新表,并将应用程序推送到PlayStore。那么我如何检查用户是否正在更新应用程序以及保存现有数据的最佳方法是什么以及如何在更新而不是全新安装时以编程方式更新data.db?

6 个答案:

答案 0 :(得分:3)

您可以使用SQLiteOpenHelper的onUpgrade方法。在onUpgrade方法中,您将oldVersion作为参数之一。

在onUpgrade中使用Switch case并在每种情况下使用版本号来跟踪为每个新版本的数据库发送的当前版本的数据库。

最好从oldVersion循环到newVersion,一次递增1版本,然后升级数据库stepbystep。当数据库版本1的人在很长一段时间后将应用程序升级到使用数据库版本7的版本并且应用程序因某些不兼容的更改而开始崩溃时,这非常有用。

然后,数据库中的更新将逐步完成,涵盖所有可能的情况,即合并为每个新版本完成的数据库更改,从而防止您的应用程序崩溃。

答案 1 :(得分:1)

有两种方式

1]更改了数据库版本,以便在用户更新时,在此方法中执行应用SQLiteOpenHelper's onUpgrade()方法,您可以编写代码来删除表n根据新架构创建新表并发送网络调用获取数据。

2]使用预安装的数据库推送应用程序。 使用db版本创建数据库并将其保存在assets文件夹中。  每当应用运行时,比较资产版本的db&应用程序的数据库。   如果资产的db版本高于应用程序的db,那么这意味着您需要更新数据库。 直接将Assete的db复制到文件夹结构中,并发送delta调用以获取数据。

答案 2 :(得分: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);        
} 

答案 3 :(得分:-1)

我建议您使用http://www.activeandroid.com/库。它支持迁移。您只需要在[n].sql文件夹中为assets/migrations版本的数据库模型编写n个文件。 Active android运行现有版本并应用所需的迁移。

答案 4 :(得分:-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();
}

答案 5 :(得分:-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方法,并在上传新数据库时更新数据库。