</pre>数据库存储<p></p><p>存储类型:数据存储用来保存结构化的数据</p><p>SQList轻量级的数据存储,适用与移动端的数据存储,可以进行基本的数据操作</p><p>好处:轻,体积小,几百k,多用于嵌入式设备</p><p><span style="white-space:pre"> </span> 绿:不用安装,解压就可以使用</p><p><span style="white-space:pre"> </span> 跨平台 单一文件的存储</p><p>弊端:对多线程的支持比较差 对sql的支持不全面 <span style="white-space: pre;"> </span></p><p>SQListOpenHelper:</p><p>用于创建和打开数据库</p><p>数据库的创建:</p><p>定义一个类继承SQListOpenHelper:</p><p></p><pre name="code" class="java">public class MySQList extends SQLiteOpenHelper {
public MySQList(Context context, String name, CursorFactory factory,int version) {
super(context, name, factory, version);
//context上下文
//name 数据库名
//factory游标,创null 默认使用系统提供的
//version 版本号,从1开始
}
@Override
//数据库被创建出来的时候系统自动调用这个方法 一般用于建表,可用db.execSQL();执行Sql语句
public void onCreate(SQLiteDatabase db) {
}
@Override
//数据库版本升级时调用这个方法 可对版本升级做一系列的操作
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
注意:在建表的时候,是可以不对表中的数据指定数据类型的,指定了也不起作用
MySQList ms = new MySQList(this, "info.db", null, 1);
SQLiteDatabase database = ms.getReadableDatabase();
创建MySQList对象 这个时候并不会与数据库建立连接
在调用 getReadableDatabase()的时候才会与数据库建立连接,如果数据库不存在的话,那么系统会新创建一个数据库,并在创建完数据库之后走oncreate()方法
关于数据库两种连接方式的不同:
若只是要对数据库执行读操作,那么就调用getReadableDatabase方法来打开数据库。否则调用getWritableDatabase方法来打开数据库
原因:如果数据库文件的容量未满,则在程序中调用getReadableDatabase方法打开数据库时,该方法会转掉用getWritableDatabase方法
如果数据库文件的容量满了,则在程序中调用getreadableDatabase方法打开数据库时,会以只读的方式打开数据库
如果数据库的文件容量满了,且程序调用getwritableDatabase打开数据库,那么就会抛异常,因为系统会认为你会执行写的操作
在我们与数据建立连接之后就可以对数据进行增删改查一系列的操作了:
安卓中对数据库的操作有两种方式:
1.执行SQL语句对其操作
2.使用安卓中封装好的类(SQLDatabase)对其操作
1.SQL语句操作数据库:
插入 删除 修改数据:
MySQList ms = new MySQList(this, "info.db", null, 1);
SQLiteDatabase database = ms.getReadableDatabase();
database.execSQL(sql);
execSQL方法中添加要执行SQL语句 由于这三个操作有一定相似性 就不一一列出
拿一个info表 里面存有name ,phone来复习下SQL语句
增--insert into info(name,phone) values('王五','13777777');
删--delete from info where name='王五';
该--update info set phone='139999999'where name='王五';
查--select name,phone from info;
关于数据库的查询:
MySQL ms = new MySQL(this);
SQLiteDatabase database = ms.getReadableDatabase();
//获取游标工厂
Cursor cursor = database.rawQuery("select * from info", null);
//游标的指针向下移动,如果没有下一个数据返回-1
while(cursor.moveToNext()){
String name = cursor.getString(1);
}
database.close();
cursor.close();
需要注意的是在对数据库操作之后要关闭数据库 用完游标工厂之后,也要对其关闭,以节省资源
SQListDatabase:
// 执行指定的sql语句,在sql语句中可以使用占位符。
// - table 要操作的表。 whereclause :where子句的条件。 whereArgs子句的所用到的参数。
public int delete(String table, String whereClause, String[] whereArgs);
// 执行指定的sql语句,在sql语句中可以使用占位符。
// - table 要操作的表。
// - values:sql语句中的所用到的参数,参数名必须要和表中的列名一致。
// - nullColumnHack :后述。
// 返回值:
// - 返回行号。提示:每成功插入一条数据,行号+1。
// - 行号类似于Oracle的序列,若删除数据,也不会导致行号回退。
// - 若主键是integer类型的,则此方法返回,新插入的行的主键。
public long insert(String table, String nullColumnHack, ContentValues values)
// 执行指定的sql语句更新数据,在sql语句中可以使用占位符。
public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
两种数据库操作的区别:
事物:
数据库的事物:两条语句同时对数据库操作,要么都成功,要么都失败
例如 :张三使用银行卡向李四转200块钱,如果张三转账成功,银行卡扣除了200块,而因为服务器等一些其他的原因,李四没有接到钱,那么这个钱就不翼而飞了。
所以要定义事物的概念,要么同时成功要么同时不成功
public void test() {
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.beginTransaction(); // 开启事务,默认情况下,事务标志为False 。
try{
db.execSQL("update person set amount=amount-10 where personid=2");
db.execSQL("update person set amount=amount+10 where personid=3");
db.setTransactionSuccessful(); // 将事务标志,设置为true 意味着,事务成功。
} finally {
// 调用此方法结束事务,事务最终是提交还是回滚是由事务标志决定的。
// 若事务的标志为True,就会提交事务,否则回滚事务。
db.endTransaction();
}
}