我在我的 android 应用程序中使用 sqlite,我的数据库文件称为 data.db。假设我有两个表,其中一个是静态值(只读),第二个是保存动态值并将应用程序推送到 playStore。
在下一个版本中,我更新了 data.db 并更新了第一个表中的值,在第二个表中添加了新列,并添加了第三个新表并将应用程序推送到 PlayStore。那么我如何检查用户是否正在更新应用程序以及保存现有数据的最佳方法是什么,以及当它是更新而不是全新安装时如何以编程方式更新 data.db?
我在我的 android 应用程序中使用 sqlite,我的数据库文件称为 data.db。假设我有两个表,其中一个是静态值(只读),第二个是保存动态值并将应用程序推送到 playStore。
在下一个版本中,我更新了 data.db 并更新了第一个表中的值,在第二个表中添加了新列,并添加了第三个新表并将应用程序推送到 PlayStore。那么我如何检查用户是否正在更新应用程序以及保存现有数据的最佳方法是什么,以及当它是更新而不是全新安装时如何以编程方式更新 data.db?
您可以使用 SQLiteOpenHelper 的 onUpgrade 方法。在 onUpgrade 方法中,您将 oldVersion 作为参数之一。
在 onUpgrade 使用 Switch 案例中,并且在每个案例中,都使用版本号来跟踪为每个新版本的数据库发送的数据库的当前版本。
最好从 oldVersion 循环到 newVersion,一次将版本递增 1,然后逐步升级数据库。当使用数据库版本 1 的人在很长一段时间后将应用程序升级到使用数据库版本 7 的版本并且应用程序由于某些不兼容的更改而开始崩溃时,这非常有用。
然后数据库中的更新将逐步完成,涵盖所有可能的情况,即合并数据库中为每个新版本所做的更改,从而防止您的应用程序崩溃。
有两种方法
1] 更改了数据库版本,以便当用户更新应用程序SQLiteOpenHelper's
onUpgrade()
方法时在此方法中执行,您可以编写代码来删除表 n 根据新模式创建新表并发送网络调用以获取数据。
2] 使用预装的数据库推送应用程序。使用 db 版本创建数据库并将其保存在assets
文件夹中。每当应用程序运行时,比较资产数据库和应用程序数据库的版本。如果资产的数据库版本高于应用程序的数据库,则这意味着您需要更新数据库。直接将 Assete 的 db 复制到文件夹 structor 并发送 delta 调用以获取数据。
在此示例中,您添加了一个新列,因此这种情况下的更改应该是这样的(在这里您不会丢失数据)。
@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);
}
我建议你使用http://www.activeandroid.com/库。它支持迁移。您只需[n].sql
在assets/migrations
文件夹中写入n
数据库模型版本的文件。Active android 携带现有版本并应用所需的迁移。
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();
}
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);
}
}
将数据库放入升级方法,然后再次调用其中的创建方法,当您上传新数据库时,您的数据库将更新。