`
liushilang
  • 浏览: 89338 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何使用SQLiteOpenHelper

 
阅读更多

都知道在Android中SQLiteOpenHelper是用来创建和升级数据库,参考
$ANDROID_SDK_HOME/docs/reference/android/database/sqlite/SQLiteOpenHelper.html

软件发布出去了,用户已经安装使用了,但是随着软件的升级,数据库结构做了些改动,我们不希望用户把应用卸载了再装(这样会丢失应用所有的数据),我们希望在数据库总体结构和已有数据不变的情况下做些小的改动,比如新增一个字段或索引,新增加一个表等等,那么这个时候我们就要用到这个类了

常用的也就是onCreate和onUpgrade这两个方法,在使用的时候这两个方法都需要重写,里面实现自己的逻辑

我们先列出一个场景:
假设第一版程序发布出去,First Public Version,代码如下

1 @Override
2 public void onCreate(SQLiteDatabase db) {
3     bootstrapDB(db);
4 }
5  
6 @Override
7 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
8 }

onUpgrade里面没有代码,第一版出去没有需要更新的,bootstrapDB方法就是些DDL和数据初始化操作等等

之后过了一段时间,新的程序发布(其中数据库结构做了些变化),这个时候已经开始使用第一版程序的用户就需要升级,我们不希望他已经存在的数据被破坏,那么我们发布出去的新的版本中代码该怎么写呢?
直接看代码,这些代码都是从Android自带的应用中抽取出来的,做了些具体业务上的简化,主要是阐述清楚用法

1 @Override
2 public void onCreate(SQLiteDatabase db) {
3     bootstrapDB(db); // 这个方法里面都是最新版的初始化方法
4 }
5  
6 @Override
7 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
8     Log.i(TAG, "Upgrading DB from version " + oldVersion + " to "
9             + newVersion);
10     if (oldVersion == 1) {
11         upgradeToVersion2(db);
12         oldVersion += 1;
13     }
14     Log.v("do upgrade", "我更新了。。。");
15 }

这样如果后来又有新的程序发布,那么这两个方法会变成类似这个样子

1 @Override
2 public void onCreate(SQLiteDatabase db) {
3     bootstrapDB(db); // 这个方法里面始终都是最新版的初始化方法
4 }
5  
6 @Override
7 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
8     Log.i(TAG, "Upgrading DB from version " + oldVersion + " to "
9             + newVersion);
10     if (oldVersion == 1) {
11         upgradeToVersion2(db);
12         oldVersion += 1;
13     }
14     if (oldVersion == 2) {
15         upgradeToVersion3(db);
16         oldVersion += 1;
17     }
18     // 这是一种逐级更新的方式
19             // 对于目前使用的还是第一版的用户而言,会先执行完upgradeToVersion2再执行upgradeToVersion3
20             // 对于目前使用的还是第二版的用户而言,会执行upgradeToVersion3
21     Log.v("do upgrade", "我更新了。。。");
22 }

这样也许就能看的很清楚这个类的意图和用法了,后面版本一直增加的话,我们就一直这样写就好,保证全新的用户和升级的用户都能正常使用,那么我们如何来调用呢
一般我们会有个构造方法,有个参数就是数据库的版本,比如下面这两个构造方法

1 public MyDatabaseHelper(Context context, String name, CursorFactory factory,
2         int version) {
3     super(context, name, factory, version);
4 }
5  
6 public MyDatabaseHelper(Context context, int version) {
7     super(context, NAME, null, version);
8 }

采用如下方式调用

1 helper = new MyDatabaseHelper(context, 10); // 这个数据库版本号会随着程序的每次发布而变化,是表示每次需要更新到的版本号,也就是最新的版本号
2 sqlite = helper.getWritableDatabase();

其实更好理解这个用法就是读SQLiteOpenHelper.getWritableDatabase这个方法,里面有段代码

1 int version = db.getVersion();
2 if (version != mNewVersion) {
3     db.beginTransaction();
4     try {
5         if (version == 0) {
6             onCreate(db);
7         } else {
8             onUpgrade(db, version, mNewVersion);
9         }
10         db.setVersion(mNewVersion);
11         db.setTransactionSuccessful();
12     } finally {
13         db.endTransaction();
14     }
15 }

另外,看看set/get Version就知道数据库版本标记是通过PRAGMA user_version;这个命令来完成的,你也可以用sqlite3之类的工具把数据库文件打开,然后执行PRAGMA user_version查看或者设置版本值

如下是完整的两个代码,是目前在使用的

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
package org.xkit.android.demo;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
 
public class DBAdapter {
private Context context;
private SQLiteDatabase sqlite;
 
private MyDatabaseHelper helper;
 
public DBAdapter(Context c) {
this.context = c;
}
 
public void open() {
helper = new MyDatabaseHelper(context, 10);
sqlite = helper.getWritableDatabase();
}
 
public void execSQL(String sql) {
Log.i("sql execute", sql);
sqlite.execSQL(sql);
}
 
public Cursor getResultSet(String tableName, String condition,
Object[] fields) {
StringBuffer sb = new StringBuffer();
String allFields = new String();
if (fields == null) {
allFields = "*";
} else {
for (int i = 0; i < fields.length; i++) {
allFields += fields[i].toString() + ",";
}
allFields = allFields.substring(0, allFields.length() - 1);
}
sb.append("select ").append(allFields).append(" from ").append(
tableName).append(" where ").append(condition);
Log.i("sqlquery", sb.toString());
return sqlite.rawQuery(sb.toString(), null);
}
 
public Cursor getResultSet(String sql) {
Log.i("sql query", sql);
return sqlite.rawQuery(sql, null);
}
 
public List<Map<String, String>> getResultSet(String sql, int pageSize) {
Log.i("sql query", sql);
Cursor cursor = sqlite.rawQuery(sql, null);
int count = cursor.getCount();
int columnCount = cursor.getColumnCount();
Log.d("Column Count", "" + columnCount);
List<Map<String, String>> list = new ArrayList<Map<String, String>>(
count);
Map<String, String> entity = new HashMap<String, String>(columnCount);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
// 找出一共有多少列
for (int i = 0; i < columnCount; i++) {
Log.d("Column Found", cursor.getColumnName(i) + " : "
+ cursor.getString(i));
entity.put(cursor.getColumnName(i), cursor.getString(i));
}
list.add(entity);
}
cursor.close();
entity = null;
return list;
}
 
public void close() {
// 关闭我们打开的数据库
throw new RuntimeException("Only for Stub!");
}
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
package org.xkit.android.demo;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;
 
public class MyDatabaseHelper extends SQLiteOpenHelper {
 
private static final String TAG = "MyDatabaseHelper";
 
public static final String NAME = "lucane.db";
 
public MyDatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
 
public MyDatabaseHelper(Context context, int version) {
super(context, NAME, null, version);
}
 
@Override
public void onCreate(SQLiteDatabase db) {
bootstrapDB(db);
}
 
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(TAG, "Upgrading DB from version " + oldVersion + " to "
+ newVersion);
if (oldVersion < 8) {
// 如果版本太小,就直接删除,然后创建
// 所以bootstrapDB应该是最新的SQL初始化语句
dropTables(db);
onCreate(db);
return;
}
 
if (oldVersion == 8) {
upgradeToVersion9(db);
oldVersion += 1;
}
 
if (oldVersion == 9) {
upgradeToVersion10(db);
oldVersion += 1;
}
 
// 这是一种逐级更新的方式
Log.v("do upgrade", "我更新了。。。");
}
 
private void bootstrapDB(SQLiteDatabase db) {
Log.i(TAG, "Bootstrapping database");
db
.execSQL("CREATE TABLE person (personid integer primary key autoincrement,name varchar(20),age integer )");
}
 
private void dropTables(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS person;");
}
 
// PATCH方法开始
 
static void upgradeToVersion10(SQLiteDatabase db) {
db.execSQL("CREATE INDEX idx_person_name_gender ON person (" + "name"
+ ", " + "gender" + ");");
}
 
static void upgradeToVersion9(SQLiteDatabase db) {
db.execSQL("ALTER TABLE "
+ "person ADD COLUMN gender INTEGER NOT NULL DEFAULT 1;");
}
 
// PATCH方法结束
}
分享到:
评论

相关推荐

    android SQLiteOpenHelper 数据库简单应用

    本篇文章将深入探讨如何在Android中使用SQLiteOpenHelper进行数据库的简单应用。 首先,SQLiteOpenHelper有两个关键方法:`onCreate()` 和 `onUpgrade()`。`onCreate()` 方法在数据库首次创建时被调用,用于执行...

    SuperDB,演示使用SQLiteOpenHelper继承子类操作数据库例子

    在实际项目中,你还可以使用`SQLiteOpenHelper`的子类实现更复杂的数据库操作,比如创建多个表、添加索引、触发器等。此外,还可以使用ContentProvider和CursorLoader来更好地管理和访问数据库,提高应用的性能和...

    SQLiteOpenHelper

    在本文中,我们将深入探讨SQLiteOpenHelper的详细使用方法,并通过一个基础的示例来展示其功能。 首先,我们需要理解SQLiteOpenHelper的生命周期。当我们创建一个继承自SQLiteOpenHelper的子类时,系统会调用两个...

    SQLiteOpenHelper和ContentProvider区别

    SQLiteOpenHelper和ContentProvider是Android开发中的两个重要组件,它们都与数据存储和访问有关,但各自扮演的角色和使用场景有所不同。 SQLiteOpenHelper是Android系统提供的一个用于管理SQLite数据库的辅助类。...

    android studio使用SQLiteOpenHelper()建立数据库的方法

    今天我们讲讲在android studio中利用数据库存储中的SQLiteOpenHelper()方法建立数据库 SQLiteOpenH elper中需要重载函数: onCreate( ):利用SQL语句,在系统中创建数据库(表)功能 onUpgrade( ):利用SQL语句,...

    android app 示例 SQLiteOpenHelper 实现数据操作

    在这个示例中,我们将深入探讨如何使用SQLiteOpenHelper进行数据操作。 SQLiteOpenHelper主要有两个关键方法:`onCreate()` 和 `onUpgrade()`。`onCreate()` 方法在数据库首次创建时被调用,用于执行初始化操作,...

    Android移动应用开发之使用ListView+SQLiteOpenHelper实现商品列表添加删除的界面

    Android移动应用开发之使用ListView+SQLiteOpenHelper实现商品列表添加删除的界面 能够输入数据然后添加到数据库,ListView会自动展现数据库的内容,点击删除能够将数据库中的信息删除并更新ListView 实现思路: 1....

    Android 数据库 SQlite 范例 SQLiteOpenHelper

    这篇教程将深入探讨如何使用SQLiteOpenHelper进行数据库操作,并结合ListView展示数据,同时也会讲解Menu键的使用。 首先,让我们了解SQLiteOpenHelper的主要方法。`onCreate()`方法会在数据库首次创建时被调用,...

    android 手机数据库 实现SQLiteOpenHelper

    接下来,你可以使用SQLiteOpenHelper的`getWritableDatabase()` 或 `getReadableDatabase()` 方法来获取可读写或只读的数据库实例,然后执行查询、插入、更新和删除等操作。例如: ```java MyDatabaseHelper ...

    android 项目利用SQLiteOpenHelper创建数据库文件Demo

    在这个“android项目利用SQLiteOpenHelper创建数据库文件Demo”中,我们将深入探讨如何在Android应用中有效地使用SQLiteOpenHelper。 首先,我们需要了解SQLiteOpenHelper的基本结构。一个典型的SQLiteOpenHelper...

    利用SQLiteOpenHelper实现SQLite数据的写入和查询

    总结来说,这个例子展示了如何使用SQLiteOpenHelper创建SQLite数据库,定义数据表,以及如何进行数据的插入和查询。同时,也演示了如何将查询结果通过ListView呈现给用户。SQLite是Android开发中常用的数据存储方式...

    android 中 SQLiteOpenHelper的封装使用详解

    "Android 中 SQLiteOpenHelper 的封装使用详解" SQLiteOpenHelper 是 Android 中一个非常重要的数据库帮助器类,它提供了对 SQLite 数据库的访问和管理功能。下面我们将详细介绍 SQLiteOpenHelper 的封装使用详解。...

    Android SqliteOpenHelper数据库的基本使用

    本篇主要介绍如何使用Android内置的`SQLiteOpenHelper`类来操作SQLite数据库,包括创建数据库、升级数据库、执行增删改查(CRUD)操作等核心知识点。 ### 1. 数据库初始化与创建 `SQLiteOpenHelper`是Android提供...

    android SQLiteOpenHelper使用示例

    本文将深入探讨SQLiteOpenHelper的使用方法及其在实际应用中的关键知识点。 首先,SQLiteOpenHelper的主要职责是创建和升级数据库。当我们首次运行应用程序时,如果数据库不存在,SQLiteOpenHelper的`onCreate()`...

    SqliteOpenHelper

    总结起来,这个项目是一个简单的Android应用,使用`SqliteOpenHelper`来管理SQLite数据库。`MainActivity`负责与用户交互,而`MyDbHelper`处理所有与数据库相关的任务。通过学习这个项目,开发者可以了解如何在...

    Android Studio SQLite数据库使用

    在本文中,我们将介绍如何使用SQLite数据库在Android Studio中,并详细解释SQLiteOpenHelper和SQLiteDatabase的使用方法。 一、SQLiteOpenHelper的使用 SQLiteOpenHelper是一个抽象类,用于创建和管理数据库。要...

    【android】SQLiteOpenHelper实现数据库的增删改查(封装的思想,一个小框架)

    最近学习安卓遇到了对数据库的操作,用到了SQLiteOpenHelper这个类来连接或者创建数据库,通过getWritableDatabase()或者...使用SQLiteOpenHelper,便是构建一个类将其继承,有三个方法必须实现: 2.1 构造方法

    Android开发之Sqliteopenhelper用法实例分析

    在Android应用开发中,SQLite是一个轻量级的...通过合理使用SQLiteOpenHelper,开发者可以更专注于应用程序的功能实现,而不用过于担心底层数据库的复杂性。希望以上内容能帮助你更好地理解和运用SQLiteOpenHelper。

    安卓数据库使用示例.rar

    在Android Studio中,开发者可以使用SQLiteOpenHelper这个辅助类来创建、升级和打开SQLite数据库。这个类提供了一些关键方法,如onCreate()用于首次创建数据库时执行的代码,onUpgrade()用于在数据库升级时执行的...

Global site tag (gtag.js) - Google Analytics