@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);
}
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();
}
3
我建议你使用http://www.activeandroid.com/库 . 它支持迁移 . 您只需要在 assets/migrations 文件夹中为 n 版本的数据库模型编写 [n].sql 文件 . Active android运行现有版本并应用所需的迁移 .
2]使用预安装的数据库推送应用程序 . 使用db版本创建数据库并将其保存在 assets 文件夹中 . 每当应用程序运行时比较资产版本's db & app' s db . 如果资产's db version is higher than app' s db那么这意味着您需要更新数据库 . 直接将Assete的db复制到文件夹结构中,并将delta调用发送到获取数据 .
-1
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);
}
}
6 回答
在这个例子中,你添加了一个新列,所以这种情况下的更改应该是这样的(这里你不会丢失你的数据) .
我建议你使用http://www.activeandroid.com/库 . 它支持迁移 . 您只需要在
assets/migrations
文件夹中为n
版本的数据库模型编写[n].sql
文件 . Active android运行现有版本并应用所需的迁移 .有两种方法
1]更改了数据库版本,以便在用户更新应用程序
SQLiteOpenHelper's
onUpgrade()
方法在此方法中执行时,您可以编写代码以删除表n根据新架构创建新表并发送网络调用以获取数据 .2]使用预安装的数据库推送应用程序 . 使用db版本创建数据库并将其保存在
assets
文件夹中 . 每当应用程序运行时比较资产版本's db & app' s db . 如果资产's db version is higher than app' s db那么这意味着您需要更新数据库 . 直接将Assete的db复制到文件夹结构中,并将delta调用发送到获取数据 .将数据库放入Upgrade方法中,然后再次调用其中的Create方法,并在上载新数据库时更新数据库 .
您可以使用SQLiteOpenHelper的onUpgrade方法 . 在onUpgrade方法中,您将oldVersion作为参数之一 .
在onUpgrade中使用Switch case并在每种情况下使用版本号来跟踪为每个新版本的数据库发送的当前数据库版本 .
最好从oldVersion循环到newVersion,一次递增1版本,然后升级数据库stepbystep . 当数据库版本1的人在很长一段时间后将应用程序升级到使用数据库版本7的版本并且应用程序因某些不兼容的更改而开始崩溃时,这非常有用 .
然后,数据库中的更新将逐步完成,涵盖所有可能的情况,即合并为每个新版本完成的数据库更改,从而防止您的应用程序崩溃 .