1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > sqlite只能用于android系统 Android 数据库的使用 -- Sqlite

sqlite只能用于android系统 Android 数据库的使用 -- Sqlite

时间:2022-04-17 05:59:41

相关推荐

sqlite只能用于android系统 Android 数据库的使用 -- Sqlite

Sqlite介绍

SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守 ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式系统中。

SQLite 数据库是无类型的,可以向一个 integer 的列中添加一个字符串,但它又支持常见的类型比如: NULL,VARCHAR, TEXT, INTEGER, BLOB, CLOB 等。

但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。

Android 系统内置了 SQLite,并提供了一系列 API 方便对其进行操作

API

SQLiteOpenHelper

SQLiteOpenHelper 是 Android 对于数据库的操作做了一个封装类,在实际使用的时候,需要继承它写一个新的子类。以下为重点方法介绍。

构造函数

传入数据库名称、版本号,在每次修改数据库结构后需要更新版本号!

onCreate

这个方法只会在首次创建数据时触发,一般在这里放入表的创建sql语句

onUpgrade

在数据库版本号发生变化后会执行,在这里要写入旧数据库升级的逻辑

示例:

public class OrderDBHelper extends SQLiteOpenHelper{

private static final int DB_VERSION = 1;

private static final String DB_NAME = "myTest.db";

public static final String TABLE_NAME = "Orders";

public OrderDBHelper(Context context) {

super(context, DB_NAME, null, DB_VERSION);

}

@Override

public void onCreate(SQLiteDatabase sqLiteDatabase) {

// create table Orders(Id integer primary key, CustomName text, OrderPrice integer, Country text);

String sql = "create table if not exists " + TABLE_NAME + " (Id integer primary key, CustomName text, OrderPrice integer, Country text)";

sqLiteDatabase.execSQL(sql);

}

@Override

public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {

String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;

sqLiteDatabase.execSQL(sql);

onCreate(sqLiteDatabase);

}

}

SQLiteDatabase

SQLiteDatabase 代表了数据库的实例对象,通过SQLiteOpenHelper 的实例对象获取。有getWritableDatabase getReadableDatabase两种获取方式,区别是假如磁盘满了,getWritableDatabase 就会失败,而如果是采用 getReadableDatabase 的方式,会返回一个只读的数据库对象。

数据库的操作一般包括 增、删、改、查以及事务。

原生方式

execSQL 用于原生sql的删除、修改、添加

db.execSQL("insert into person(name, age) values('炸死特', 4)");

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

db.execSQL("delete from t_user where c_age", new Object[] { 21 });

db.execSQL("update t_user set c_name=? where c_age=?", new Object[] { "lisi", 25 });

rawQuery 用于原生sql的查询

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

Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%炸死特%", "4"});

API

除了原生的方式之外,还提供了几种方便的调用方式

//删除

db.delete("person", "personid", new String[]{"2"});

//添加

ContentValues values = new ContentValues();

values.put("c_name", "王五" + new Random().nextInt(10));

values.put("c_age", new Random().nextInt(50));

values.put("c_phone", "5556");ContentValues values = new ContentValues();

values.put("c_name", "wangwu");

//修改

int update = database.update(TABLE_NAME, values, "c_age=?", new String[] { "28" });

//查询

Cursor cursor = database.query(TABLE_NAME,

new String[] {"uid", "c_name", "c_age", "c_phone" },

"c_age", new String[] { "130" }, null, null, "c_age desc");

事务

在 SQLiteDatabase 提供了对事务的支持,处于事务中的操作都是“临时性”的,只有事务提交了 才会将数据保存到数据库。

事务的使用不仅可以保证数据的一致性,也可以提高批处理时的执行效率。

SQLiteDatabase 提供的 beginTransaction()打开事务,endTransaction()结束事务。

注意:结束 事务并不代表事务提交,如果想让数据写入的数据库需要在结束事务前执行 setTransactionSuccessful()方法。这是事务提交的唯一方式。

//数据库的事务操作

SQLiteDatabase database = mOpenHelper.getReadableDatabase();

String sql = "update t_user set c_money=c_money-500 where c_name=?";

// 模拟转账

// 开启了事务,那么之后的操作都是在缓存中执行

database.beginTransaction();

database.execSQL(sql, new String[] { "wangwu" });

// 在事务中模拟一个异常的发生

int a = 1 / 0;

String sql2 = "update t_user set c_money=c_money+500 where c_name=?";

database.execSQL(sql2, new String[] { "lisi" });

// 只有执行该代码,才将缓存中的数据写到数据库中

database.setTransactionSuccessful();

database.endTransaction();

database.close();

工具

推荐使用 Sqlite Studio 免费、开源、好用

https://sqlitestudio.pl/index.rvt

参考

/p/f80f0fe088b9

/p/5c33be6ce89d

/jason0539/article/details/10248457

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。