public class DatabaseHelper extendsSQLiteOpenHelper {

//类没有实例化,是不能用作父类构造器的参数,必须声明为静态

private static final String name = "bob";//数据库名称

private static finalint version = 1; //数据库版本

private static SQLiteDatabase readableDB;

private static SQLiteDatabase writableDB;

public DatabaseHelper(Context context) {

//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类

super(context, name, null, version);

}

@Override public void onCreate(SQLiteDatabasedb) {

db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, namevarchar(20), age INTEGER)");

}

@Override public void onUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion) {

db.execSQL("DROP TABLE IF EXISTS person");

onCreate(db);

}

public SQLiteDatabase getReadableDatabase(Context context) {
if(readableDB == null){
readableDB = getReadableDatabase();
}
return readableDB;
}

public SQLiteDatabase getWritableDatabase(Context context) {

if(writableDB== null){
writableDB = getWritableDatabase();
}
return writableDB;
}

public static void closeDB(){

if(readableDB != null&&readableDB.isOpen()) {
readableDB.close();
readableDB = null;
}

if(writableDB!= null&&writableDB.isOpen()) {
writableDB.close();
writableDB= null;
}

}

}

上面onUpgrade()方法在数据库版本每次发生变化时都会把用户手机上的数据库表删除,然后再重新创建。一般在实际项目中是不能这样做的,正确的做法是在更新数据库表结构时,还要考虑用户存放于数据库中的数据不会丢失。

getWritableDatabase()getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

SQLiteDatabasedb = ....;

db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"bob", 4});

db.close();

SQLiteDatabasedb = ....;

Cursor cursor =db.rawQuery(“select * from person”, null);

while (cursor.moveToNext()) {

intpersonid =cursor.getInt(0);//获取第一列的值,第一列的索引从0开始

String name =cursor.getString(1);//获取第二列的值

int age =cursor.getInt(2);//获取第三列的值

}

cursor.close();

db.close();

SQLiteDatabasedb = ....;

db.beginTransaction();//开始事务

try {

db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"bob", 4});

db.execSQL("update person set name=? wherepersonid=?", new Object[]{"bob", 1});

db.setTransactionSuccessful();//调用此方法会在执行到endTransaction()时提交当前事务,如果不调用此方法会回滚事务

} finally {

db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务

}

db.close();

更多相关文章

  1. Android剪裁图片简单的方法
  2. : Failed to read row 0, column -1 from a CursorWindow which
  3. android之HttpPost&HttpGet使用方法介绍
  4. Android获取视频音频的时长的方法
  5. 《转载》Android(安卓)AlertDialog 方法setView(view,0,0,0,0)的
  6. Android(安卓)Model正确使用姿势——AutoValue
  7. Android(安卓)databinding RecycleView item 子控件点击事件
  8. Android给自定义按键添加广播和通过广播给当前焦点输入框赋值
  9. SQLite数据库并发访问

随机推荐

  1. android paint api drawText 绘制字体字
  2. Ubuntu 11.10 64bit系统编译android 2.3
  3. 支付宝蜻蜓刷脸支付——Android
  4. 移动开发者必须知道的Android框架推荐
  5. Android(安卓)怎么判断Wifi 是否可用
  6. Preference 使用方法详解
  7. Android如何用代码重复加载同一个xml
  8. Android:使用canvas绘制饼状统计图(自动适
  9. Android(Java):jni学习
  10. 保持应用程序界面不随手机转动而转动 解