您的位置:首页 > 数据库

SQLite数据库存储(创建数据库,升级数据库和增删改查四种基本操作)

2020-06-02 04:39 465 查看
参考书籍:第一行代码

我们Android系统是内置了数据库的,在SDK中的platform-tools文件夹中。


SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百k的内存就足够了,因此比较适合在移动设备上使用。

创建数据库

首先我们需要创建一个自己的帮助类,去继承于SQLiteOpenHelper这个帮助类。SQLiteOpenHelper中有两个抽象方法,一个是onCreate()方法,在这个方法中实现创建数据库的逻辑。一个是onUpgrade()方法,在这个方法中实现升级数据库的逻辑。

MyDatabaseHelper .java 类

public class MyDatabaseHelper  extends SQLiteOpenHelper {

public static final String CREATE_BOOK = "create table book("
+ "id integer primary key autoincrement,"
+ "author text,"
+ "price real,"
+ "pages integer,"
+ "name text)";

private Context mcontext;

public MyDatabaseHelper(Context context,  String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mcontext = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mcontext,"创建成功",Toast.LENGTH_SHORT).show();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

我们把创建数据库的SQL语句定义成一个常量,然后在onCreate()方法中去调用SQLiteDatabase的execSQL()方法中去执行这条创建表的语句,并弹出创建成功的语句。这样在创建数据库的同时也可以把表创建了。

SQLite的数据类型比较简单,我们这里简单讲一下,

integer  表示整型
real     表示浮点型
text     表示文本类型
blob     表示二进制类型

acticity_main.xml代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="创建数据库"/>

</LinearLayout>

这里加了一个按钮,用于创建数据库。

MainActivity.java代码

public class MainActivity extends AppCompatActivity  {

private MyDatabaseHelper myDatabaseHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//帮助类对象
myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);

Button createDatabase = findViewById(R.id.create_database);//添加创建数据库的按钮控件
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDatabaseHelper.getWritableDatabase();//创建数据库

}
});
}
}

这里在onCreate()方法中构建了一个MyDatabaseHelper对象,并且通过构造函数的参数,第一个参数是场景,第二个参数为数据库名(记得要加后缀.db,不然他会认为不是个SQLite数据库),第三个参数是游标,第四个参数是版本号(第一次创建就写1,用于升级)。
创建数据库提供了两种方法,一个是getReadableDatabase()方法getWritableDatabase()方法。这两个方法都可以创建或打开一个数据库(如果数据库已存在就直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。我这里用的是getWritableDatabase()。

然后你就可以去运行这个程序了。它存在在**/data/data/你的包名/databases/**目录下。但是表你无法通过它查看,我这里用的是SQLite Expert Professional查询。你把数据库文件保存到本地桌面上,然后将他拖进SQLite Expert Professional中,就可以查看到了,但是SQLite Expert Professional有一个不好的地方,你每次往数据库里添加了东西,都要重新导入SQLite Expert Professional中,他相当于一个离线的,不能同步刷新。

现在是什么数据都没有的,因为我们还没有往里面加数据。

SQLite Expert Professional下载网址:https://www.7down.com/soft/4072.html

升级数据库

MyDatabaseHelper .java 类

public class MyDatabaseHelper extends SQLiteOpenHelper {

public static final String CREATE_BOOK = "create table book("
+ "id integer primary key autoincrement,"
+ "author text,"
+ "price real,"
+ "pages integer,"
+ "name text)";

public static final String CREATE_CATEGORY = "create table Category("
+ "id integer primary key autoincrement,"
+ "category_name text,"
+ "category_code integer)";

private Context mcontext;

public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mcontext = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mcontext,"创建成功",Toast.LENGTH_SHORT).show();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
}

这里我们新建了一个表Category,然后在onUpgrade()方法中执行了两条drop语句,如果数据库中存在这两个表,就将他们删掉,重新调用onCreate()方法去重新创建。如果要让这个onUpgrade()方法可以执行,就要去更改一下MainActivity.java代码中的构造函数的第四个参数版本号,我们之前传的是1,现在只要传一个比1大的数就行了。

MainActivity.java代码

public class MainActivity extends AppCompatActivity  {

private MyDatabaseHelper myDatabaseHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//帮助类对象
myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);

Button createDatabase = findViewById(R.id.create_database);//添加创建数据库的按钮控件
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDatabaseHelper.getWritableDatabase();//创建数据库

}
});
}
}

现在就可以重新运行一下程序,去SQLite Expert Professional中查看两个表是否被创建。

增删改查四种基本操作

安卓中提供了一系列用于增删改查的辅助性方法,如果你对SQL语句十分熟悉,你也可以用SQL语句来操作,根据每个人的习惯吧,这里我两个都会写到,不过会主要偏向于讲解Android的方法。

添加数据

SQLiteDatabase中提供了一个insert()方法,这个用于添加数据,它接收三个参数:

第一个参数是:表名。
第二个参数是:用于在未指定添加数据的情况下给某些可为空的列自动赋值null,一般我们用不到这个功能,传入null就行了。
第三个参数是:一个ContentValues对象,他提供了一系列的put()方法重载,用于向ContentValues中添加数据。
只要将表中的每一个列名和他所对应的带添加的值传进去就行了。

基本用法我们说完了,就看下代码吧!

activity_main.xml代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<Button
android:id="@+id/add_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="添加数据"/>

</LinearLayout>

我们添加了一个按钮,用于添加数据。

MainActivity.java 代码

public class MainActivity extends AppCompatActivity  {

private MyDatabaseHelper myDatabaseHelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//帮助类对象
myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4);
//先获取到SQLiteDatabase对象
db =  myDatabaseHelper.getWritableDatabase();//创建数据库
//添加数据
Button addData = findViewById(R.id.add_daea);//添加数据的按钮控件
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//方法一:SQL语句添加数据
//db.execSQL("insert into Book(name,author,pages,price)values(?,?,?,?)",new String[]{"恶意","东野圭吾","300","28.88"});

//方法二:用Android方法添加数据
//使用 ContentValues来组装数据
ContentValues values= new ContentValues();
//开始放入第一条数据
values.put("name","天空不要为我掉眼泪");
values.put("author","微酸袅袅");
values.put("pages",239);
values.put("price",23);
//把数据插入到表中(表名,给我指定的值赋值为null,插入的数据对象)
db.insert("Book",null,values);//插入第一条数据
//清空数据
values.clear();
//第二条数据
values.put("name","白夜行");
values.put("author","东野圭吾");
values.put("pages",239);
values.put("price",28);
//把数据插入到表中(表名,给我指定的值赋值为null,插入的数据对象)
db.insert("Book",null,values);//插入第二条数据
Toast.makeText(MainActivity.this,"数据插入成功!",Toast.LENGTH_SHORT).show();

}
});
}
}

这里我把前面创建数据库的按钮删掉了,改成了,只要一启动这个程序,他就会自己创建数据库和表,不用我们手动去创建。
我们创建了一个全局的SQLiteDatabase对象,然后在获取这个SQLiteDatabase对象。在添加数据的按钮点击事件中去使用 ContentValues来组装数据,再把数据添加进表中。
现在可以运行一下程序,去SQLite Expert Professional中查看数据是否被加入。

可以看出,数据已经加入到表中了。

更新数据

接下来,我们来看看怎么样修改表中的数据。SQLiteDatabase中提供了一个update()方法用于对数据进行更新。这个方法有四个参数:

第一个参数:表名
第二个参数:ContentValues对象,吧要更新的数据组装进去
第三、第四个参数:用于去约束更新某一行或某几行中的数据,不指定的话默认就是更新所有

现在来修改一下代码。

activity_main.xml代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<Button
android:id="@+id/add_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="添加数据"/>

<Button
android:id="@+id/update_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="更新数据"/>
</LinearLayout>

添加了一个用于更新的按钮。

MainActivity.java 代码

public class MainActivity extends AppCompatActivity {

private MyDatabaseHelper myDatabaseHelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//帮助类对象
myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4);
//先获取到SQLiteDatabase对象
db =  myDatabaseHelper.getWritableDatabase();//创建数据库

//添加数据的代码省略。。。

//修改数据
Button updateData = findViewById(R.id.update_daea);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//方法一:Android方法更新数据
ContentValues values = new ContentValues();
values.put("price",15);
db .update("Book",values,"name =?",new String[]{"天空不要为我掉眼泪"});
//方法二:SQL语句更新数据
//db.execSQL("update Book set price= ? where name =?",new String[] {"15","天空不要为我掉眼泪"});

}
});
}
}

我们更新按钮的点击事件中,创建了一个ContentValues 对象,并且给他指定了一组数据,修改这组数据中的价格字段,修改为15。可以看到,update()方法中的第三个参数对应着SQL语句中where部分,?表示占位符。第四个参数是第三个参数中每个占位符对应的数据。我这里的意思就是把书名伪天空不要为我掉眼泪这本书的价格改为15.

然后我们运行一下程序,看一下效果。

删除数据

SQLiteDatabase中提供了一个delete()方法用于删除数据。

activity_main.xml代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<Button
android:id="@+id/add_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="添加数据"/>

<Button
android:id="@+id/update_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="更新数据"/>

<Button
android:id="@+id/delete_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="删除数据"/>

</LinearLayout>

MainActivity.java 代码

public class MainActivity extends AppCompatActivity  {

private MyDatabaseHelper myDatabaseHelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//帮助类对象
myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4);
//先获取到SQLiteDatabase对象
db =  myDatabaseHelper.getWritableDatabase();//创建数据库

//添加数据的代码省略。。。

//修改数据代码省略。。。。

//删除数据
Button deleteData = findViewById(R.id.delete_daea);
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//方法一:用Android方法删除数据
db.delete("Book","price >?",new String[]{"25"});

//方法二:用SQL语句删除数据
//db.execSQL("delete from Book where price >?",new  String[] {"25"});
}
});
}
}

在删除按钮的点击事件中,我们指明了去删除book表中的数据,把价格超过25元的删除掉。然后重新运行一下程序。

我们看到数据中只剩下了一条数据,并且价格小于25.所以我们删除成功了。

查询数据

SQLiteDatabase中提供了一个query()方法用于对数据进行查询,这个方法一个用7个参数,我们来看一下它的含义。

第一个参数:表名
第二个参数:指定去查那几列,不指定则默认查询所有列
第三、四个参数:用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行
第五个参数:用于指定需要去group by的列,不指定则表示不对查询结果进行group by操作
第六个参数:用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤
第七个参数:用于指定查询结果的排序方式,不指定则表示使用默认的排序方法

下图可以参考一下:

我们来看下代码吧,

activity_main.xml代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<Button
android:id="@+id/add_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="添加数据"/>

<Button
android:id="@+id/update_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="更新数据"/>

<Button
android:id="@+id/delete_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="删除数据"/>

<Button
android:id="@+id/query_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="查询数据"/>

<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

这里我们创建了一个用于查询的按钮,一个用于查看数据的TextView。

MainActivity.java 代码

public class MainActivity extends AppCompatActivity  {

private MyDatabaseHelper myDatabaseHelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//帮助类对象
myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4);
//先获取到SQLiteDatabase对象
db =  myDatabaseHelper.getWritableDatabase();//创建数据库

//添加数据的代码省略。。。

//修改数据代码省略。。。。

//删除数据代码省略

//查询所有数据
Button queryData = findViewById(R.id.query_daea);
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//查询BOOK表中所有数据
Cursor cursor = db.query("Book",null,null,null,null,null,null);
String data = "";
while (cursor.moveToNext()){
//遍历cursor对象,取出数据并打印
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
data = data +"\n"+ " "+name + " "+author+" "+pages+" "+price;

}
TextView textView = findViewById(R.id.text);
textView.setText(data);
cursor.close();
}
});
}
}

这里调用了moveToNext()来将数据的指针移动到第一行的位置,然后去循环遍历查询到的每一行数据。在循环中通过Cursor的getColumnIndex()方法获取到某一列在表中对应的位置索引,然后再将这个索引传入到相应的取值方法中,就可以读到数据库中的数据。我们用TextView把数据显示出来。最后不要忘了关闭Cursor.

然后我们运行下程序,看一下效果:

使用SQL操作数据库

前面的代码中,我有写,这里就简单的归类一下。

添加数据:
db.execSQL("insert into Book(name,author,pages,price)values(?,?,?,?)",new String[]{"恶意","东野圭吾","300","28.88"});
更新数据:
db.execSQL("update Book set price= ? where name =?",new String[] {"15","天空不要为我掉眼泪"});
删除数据:
db.execSQL("delete from Book where price >?",new  String[] {"25"});
查询数据:
db.rawQuery("selete * from Book",null);  //这里是调用SQLiteDatabase的rawQuery()方法

使用事务

SQLite数据库是支持事务的,事务的特性可以保证某一系列的操作要么全部完成,要么一个都不会完成。
我们来看下如何在Android中使用事务。如果我们要删除掉book表中的数据,替换成新的数据。可以先用delete删除数据,在用insert将新数据添加进去,我们必须保证删除数据和添加数据必须一起完成,否则就还要继续保存原来的数据。

activity_main.xml代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<Button
android:id="@+id/add_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="添加数据"/>

<Button
android:id="@+id/update_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="更新数据"/>

<Button
android:id="@+id/delete_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="删除数据"/>

<Button
android:id="@+id/query_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="查询数据"/>

<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<Button
android:id="@+id/replace_daea"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F0FFFF"
android:text="替换数据"/>

</LinearLayout>

这里我们又添加了一个用于替换数据的按钮。

MainActivity.java代码

public class MainActivity extends AppCompatActivity {

private MyDatabaseHelper myDatabaseHelper;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//帮助类对象
myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,4);
//先获取到SQLiteDatabase对象
db =  myDatabaseHelper.getWritableDatabase();//创建数据库

//添加数据的代码省略。。。

//修改数据代码省略。。。。

//删除数据代码省略

//查询所有数据
Button queryData = findViewById(R.id.query_daea);
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//查询BOOK表中所有数据
Cursor cursor = db.query("Book",null,null,null,null,null,null);
String data = "";
while (cursor.moveToNext()){
//遍历cursor对象,取出数据并打印
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
data = data +"\n"+ " "+name + " "+author+" "+pages+" "+price;

}
TextView textView = findViewById(R.id.text);
textView.setText(data);
cursor.close();
}
});

//替换数据
Button btn_replace = findViewById(R.id.replace_daea);
btn_replace.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
db.beginTransaction();//开启事务
try{
db.delete("Book",null,null);
if(true){
//手动抛出一个异常,让事务失败
throw new NullPointerException(); //第二次执行的时候,把这句代码注释掉
}
db.execSQL("insert into Book(name,author,pages,price)values(?,?,?,?)",new String[]{"恶意","东野圭吾","300","28.88"});
db.setTransactionSuccessful();//事务已经执行成功
Toast.makeText(MainActivity.this,"替换成功!",Toast.LENGTH_SHORT).show();
}catch (Exception e){
e.printStackTrace();
}finally {
db.endTransaction();//结束事务
}
}
});
}
}

我们先开启一个事务beginTransaction(),然后在一个异常捕获的代码块中去执行具体的数据库操作,但所有操作完成后调用setTransactionSuccessful()表示事务已经执行成功,最后在finally中调用endTransaction()结束事务。这里注意,我们在删除代码执行完后手动抛出了一个异常,导致事务失败,就不会执行添加数据的操作,而事务的失败,表示删除数据的操作也不会执行。

然后我们去运行一下程序,第一次操作时,不会有任何效果,因为我们手动抛出了一个异常,让事务失败了。
我们把手动抛出异常的那一行代码删除或注释掉,再重新运行一下程序。然后就会发现数据已经被替换成新数据了。

升级数据库的最佳写法

我们前面使用的升级数据库方法有些粗暴,为了保证数据库中的所有表都是最新的,我们只是在onUpgrade()方法中删除掉当前所有表,然后再重新调用onCreate()方法创建表。而这样子的弊端也出来了,我们在删除表的同时,也把表的数据给删除了。如果是一个程序的话,就相当于删除了你的用户资料,你的用户也会大量流失。

MyDatabaseHelper.java代码

public class MyDatabaseHelper extends SQLiteOpenHelper {

public static final String CREATE_BOOK = "create table book("
+ "id integer primary key autoincrement,"
+ "author text,"
+ "price real,"
+ "pages integer,"
+ "name text,"
+ "category_id integer)";

public static final String CREATE_CATEGORY = "create table Category("
+ "id integer primary key autoincrement,"
+ "category_name text,"
+ "category_code integer)";

private Context mcontext;

public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mcontext = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mcontext,"创建成功",Toast.LENGTH_SHORT).show();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//选择版本号
switch (oldVersion){
case 1:
db.execSQL(CREATE_CATEGORY);
case 2:
db.execSQL("alter table Book add column category_id integer");
default:
}
}
}

我们在onUpgrade()方法中添加了一个switch判断,
如果用户当前版本号为1 ,就只创建一个Category表,如果用户是直接安装第二版本时,就会将两张表一起创建。而当用户是使用第二版本覆盖第一版本时,就会到进入升级数据库的操作,此时因为book已经存在了,就只需要创建一个Category表。
如果用户当前版本号为2 ,就会执行alter命令,在book表中新增一个 category_id 列。
我们这里要注意一点,这里的switch没有加break,是保证你在跨版本升级时,每一次的数据库修改都能被全部执行到。使用这种方式来维护数据库的升级,不管版本怎么样更新,都可以保证数据库的表结构是最新的,而且表中的数据也完全不会丢失。

这漫长的SQLite内容就没了。此时此刻我们应该进入漫长的休息中!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐