Sqlite数据库,增删改查,升级和事物
来源:互联网 发布:linux yum pip 编辑:程序博客网 时间:2024/05/04 16:04
1. Sqlite数据库
SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式系统中。SQLite数据库是无类型的,可以向一个integer的列中添加一个字符串,但它又支持常见的类型比如:NULL,VARCHAR, TEXT, INTEGER, BLOB, CLOB等。
Android 系统内置了SQLite,并提供了一系列API方便对其进行操作。
使用SQLiteOpenHelper 创建数据库
SQLiteOpenHelper 是Android提供的一个抽象工具类,负责管理数据库的创建、升级工作。如果我们想创建数据库,就需要自定义一个类继承SQLiteOpenHelper,然后覆写其中的抽象方法。代码如下:
/**
* 定义一个我们自己的数据库创建的帮助类
*/
public class MyDataBaseOpenHelperextends SQLiteOpenHelper {
/**
* @param context
* 上下文
* @param test
* .db 数据库文件的名称
* @param null默认游标工厂 从数据库文件的头部开始的
* @param 1 version数据库的版本号 最小是1
*/
public MyDataBaseOpenHelper(Context context) {
super(context,"test.db", null, 2);
}
/**
* 当数据库第一次被创建的时候调用的方法.这个方法只会执行一次,一般在这个方法里面初始化数据的表结构.
*/
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("数据库oncreate");
db.execSQL("create table student (_id integer primary key autoincrement, name varchar(20), phone varchar(30))");
}
/**
* 当数据库需要被更新的时候调用的方法 数据库只能升级不能降级
* @param oldVersion
* 旧的数据库的版本
* @param newVersion
* 新的数据库的版本
*/
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) {
System.out.println("数据库要被更新了,onupgrade");
// db.execSQL("alter table student add accountvarchar(20)");
}
}
注意:
上面的代码我们只是定义了一个MySQLiteOpenHelper类继承了SQLiteOpenHelper类。在onCreate() 方法中通过执行sql语句实现表的创建。onUpgrade()方法只有在数据库版本发生变化的情况下才会执行。
如果只是创建出来该类并不会真正的去创建数据库,而是需要通过执行helper.getWritableDatabase()或者hepler.getReadableDatabase():
public class MainActivityextends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这一句代码执行完毕数据库是不会被创建的.
MyDataBaseOpenHelper helper = new MyDataBaseOpenHelper(this);
//下面这一行代码执行了 数据库才会被创建
helper.getWritableDatabase();
}
}
上面的代码如果第一次执行,则会创建一个数据库文件,创建的数据库文件位于/data/data/包名/databases/目录中。如果数据库已经创建,则只是打开数据库而不会再去创建。
数据库的增删改查
刚才创建了MySQLiteOpenHelper类,通过该类可以获取SQLiteDatabase对象。而SQLiteDatabase对象则可实现对数据库的增删改查操作。
使用纯SQL语句实现
增 (db.execSQL(sql,Object[]{}))
sql-->insert into tableName(columnName1,columnName2,...) values (?,?,...)
删 (db.execSQL(sql,Object[]{}))
sql-->delete from tableName where columnName=?
改 (db.execSQL(sql,Object[]{}))
sql-->update tableName set columnName1 = ? where columnName2 = ?
查 (db.rawQuery(sql,Object[]{}))
sql-->select * from tableName where columnName = ?
表中增加列 (db.execSQL(sql))
sql-->alter table tableName columnName type
注意:
使用纯SQL 语句操作适合SQL 比较熟练的程序员。如果SQL掌握的不好,没关系,Android提供了一套API可以帮助我们完成以上操作。
使用Android下的API实现增删改查
增
ContentValues values = new ContentValues();
values.put(columnName, value);
db.insert(tableName,null,values);
//第一个参数表名; 第二个参数:如果ContentValues为空,那么默认情况下是不允许插入空值的,但是如果给该参数设置了一个指定的列名,那么就允许ContentValues 为空,同时给该列插入null值。第三个参数:要插入的数据
删
//第一个参数:表名;第二个参数:删除条件;第三个参数:用于替换第二个参数的?; 返回值:删除成功的个数
db.delete(tableName, "name=?", new String[]{value});
改
ContentValues values = new ContentValues();
values.put(columnName, value
db.update(tableName, values, "name=?", new String[] { value });
查
Cursor cursor = db.query(tableName,需要查询的列, "name=?", new String[]{value},null,null,排序);
注意:
1. contentValues该类底层是Map数据结构 values.put(key,values): key对应数据库表中字段 value是想插入的值
2. tableName 是表名,不是数据库名
3.使用db进行增删改查的时候注意用完进行db.close()释放资源
4.cursor对象是数据库查询完毕后封装的一个结果集,可以通过moveToNext判断是否还有下一个可获取的值,通过cursor.getString(index)获取对应的值;
这里的index对应的是查询的时候查询的哪一列:0对应columName1;1对应columNmae2……
两种SQLiteDatabase的不同
SQLiteOpenHelper有两个方法均可返回SQLiteDatabase对象:
1.getWritableDatabase()
该方法返回的对象和另外一个方法返回的对象没有任何差异,返回的对象对数据库都可以进行读、写操作,当磁盘已满或者权限不足的情况下该方法会抛出异常。
2.getReadableDatabase()
跟另外一个方法相比,在磁盘已满的情况下,该方法不会抛出异常,而是返回一个只读的数据库操作对象。根据这两种方法返回对象的差异,如果需要对数据库进行查询操作则推荐使用后者,如果添加、修改、删除数据则推荐使用前者。
数据库的升级和事务
1. 数据库的升级
在创建MySQLiteOpenHelper对象的时候需要传递一个int类型的version参数,代表数据库的版本号,数值从1开始。如果在new MySQLiteOpenHelper对象的时候传 递的version大于先去创建的version,那就会导致系统回调onUpgrade方法,从而实现了数据库的升级。
2. 数据库的事物
SQLiteDatabase 提供了对事务的支持,处于事务中的操作都是“临时性”的,只有事务提交了才会将数据保存到数据库。事务的使用不仅可以保证数据的一致性,也可以提高批处理时的执行效率。SQLiteDatabase提供的beginTransaction()打开事务,endTransaction()结束事务。注意:结束事务并不代表事务提交,如果想让数据写入数据库需要在结束事务前执行setTransactionSuccessful()方法。这是事务提交的唯一方式。
如下代码模拟转账的过程中出现异常,如果开启了事务那么整个转账过程都不会执行成功。
BankDBOpenHelper helper = new BankDBOpenHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
db.beginTransaction(); // 开启事务
try {
// 模拟转账的操作
db.execSQL("update account set money=money-100 where name='zhangsan'");
s.equals("haha");
db.execSQL("update account set money=money+100 where name='lisi'");
db.setTransactionSuccessful();//设置事务执行成功
} finally {
db.endTransaction();//还可以回滚代码
}
db.close();
- Sqlite数据库,增删改查,升级和事物
- Android SQLite 实例—增删改查、数据库版本升级
- sqlite数据库增删改查
- SQLite数据库增删改查
- android 数据库sqlite 增删改查和数据库事务
- SQlite---SQLite数据库增删改查操作
- Android SQLite创建数据库和两种增删改查
- 2.2 SQLite数据库的增删改查和事务
- 数据库:SQLite数据库的增删改查
- SQLite数据库---数据库的增删改查
- SQLite数据库的增删改查代码
- sqlite数据库之增删改查
- SQLite数据库增删改查操作
- android sqlite数据库增删改查
- SQLite数据库创建与增删查改
- SQLite数据库增删改查操作
- Android SQLite数据库增删改查
- Android SQLite数据库增删改查
- 解决Android Studio 2.2.3中添加.cpp .h文件在Project->Android无法显示,无法正常编译问题。
- 那些烦人的同步和互斥问题
- 最新的免费电影资源APP
- muduo的http库剖析
- Linux安装教程
- Sqlite数据库,增删改查,升级和事物
- B/S网络架构浅析
- unity3D学习之API_Transform 位置
- 高性能 CSS3 动画
- 博为峰Java技术题 ——JavaSE Java Swing顶层容器类和包含层次Ⅰ
- C指针 --- 指针数组 数组指针
- Sublime Text和WebStorm中配置LESS介绍
- Android 多渠道打包的几种方式
- (二)基本数据类型