Android复习之旅--SQLite
来源:互联网 发布:csgo loss网络优化 编辑:程序博客网 时间:2024/06/06 20:25
SQLite的知识点实在是太多了,将其一一整理出来可能会耗费太多时间,实在抱歉,或许以后会推出关于SQLite的其它知识点。在此只整理出SQLite的增删改查还有事务处理,并将它们封装到方法中,便于阅读。
SQLite简介
SQLite是一个轻量级数据库,支持SQL语言、事务处理等功能。SQLite没有服务器进程,它通过文件保存数据,该文件是跨平台的,可以放在其他平台中使用。
SQLite支持NULL、INTEGER、REAL(浮点数)、TEXT(字符串)和BLOB(二进制对象,1为true,0为false)5种数据类型。
但实际上SQLite也接收varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转换成对应的5种数据类型。因此可以将各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型。这也是SQLite数据库的最大特点。
数据库文件保存的位置
/data/data//databases/xxx.db
数据库在创建的时候默认会创建一张表(metadata.db)来保存系统语言环境
数据库增删改查的SQL语句
- 增加:insert into 表名(字段名,…) values(值,…)
- 删除:delete from 表名 where 条件
- 更新:update 表名 set 字段名=值,… where 条件
- 查询:select 字段名 from 表名 where 条件
添加约束
在数据库表中,往往会给某些字段添加约束来满足特定的需求
- 主键:primary key (字段 … primary key)
- 外键:references (字段 … references data2 (主键))
- 非空:not null(字段 … not null)
- 唯一:unique (字段 … unique)
- 默认值:default (字段 … default 默认值)
SQLiteOpenHelper类的常用方法
这是一个抽象类,该类用于创建数据库和数据库版本更新。需要创建新的类来继承
void onCreate(SQLiteDatabase db); //创建数据库时调用,子类必须重载此方法void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion); //数据库版本更新时调用,子类必须重载此方法SQLiteDatabase getReadableDatabase(); //创建或打开一个只读的数据库SQLiteDatabase getWritableDatabase(); //创建或打开一个读写的数据库
SQLiteDatabase类的常用方法
执行带占位符的SQL语句实现增删改查
/** 带占位符的SQL语句;条件值 */void execSQL(String sql, Object[] bindArgs); /** 带占位符的SQL语句;条件值 */Curosr rawQuery(String sql, String[] selectionArgs);
或调用API中的方法实现增删改查
/** 表名;一般为null即可;添加的内容*/long insert(String table, String nullColumnHack, ContentValues values); // -1为添加失败/** 表名;条件;条件值*/int delete(String table, String whereClause, String[] whereArgs); // 返回受影响的行数/** 表名;修改的内容;条件;条件值*/int update(String table, ContentValues values, String whereClause, String[] whereArgs); // 返回受影响的行数/** 表名;返回的列;条件;条件值;group by;having;order by */Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); //返回结果集void close(); //关闭数据库
两种增删改查的优缺点
- 自己写sql语句
- 灵活
- 资源占用小
- 可以实现表的级联查询
- google的现成API
- 方便
- 资源开销比较大
- 有返回值
Cursor接口的常用方法
Cursor是一个游标接口,在数据库操作中返回值,相当于结果集ResultSet
boolean moveToNext(); //移动光标到下一行boolean moveToFirst(); //移动光标到第一行boolean moveToPosition(int position); //移动光标到指定位置int getCount(); //返回Cursor中的行数int getPosition(); //返回当前Cursor的位置int getColumnIndex(String columnName); //返回指定列的索引值,如不存在则返回-1int getInt(int columnIndex); //返回指定列的整数值String getString(int columnIndex); //返回指定列的字符串
数据库的常用操作
创建一个类继承自SQLiteOpenHelper,复写父类的方法
public class PersonDBOpenHelper extends SQLiteOpenHelper { public PersonDBOpenHelper(Context context) { //上下文,数据库名称,游标工厂(默认为null即可),版本号 super(context, "rixin", null, 1); } @Override public void onCreate(SQLiteDatabase db) { // 创建SQLite数据表(数据库第一次创建时调用) db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),age integer)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库的版本升级时调用 Log.w("info", "数据库升级了"); }}
实例化数据库类
PersonDBOpenHelper helper = new PersonDBOpenHelper(this);
添加记录
/** * 添加记录 * name:要添加记录中的某个字段名 * age:要添加记录中的某个字段名 */public void insertRecord(String name, int age) { SQLiteDataBase db = helper.getWritableDatabase(); // 打开一个读写的数据库 // db.execSQL("insert into info(name,age) values(?,?)", new String[]{name, age}); ContentValues values = new ContentValues(); values.put("name", name); values.put("age", age); long i = db.insert("info", null, values); if (i == -1) { Toast.makeText(this, "添加记录失败", 0).show(); } esle { Toast.makeText(this, "添加记录成功", 0).show(); } db.close();}
删除记录
/** * 删除记录 * name:要删除的记录中的某个字段名 */public void deleteRecord(String name) { SQLiteDatabase db = helper.getReadableDatabase(); // 打开一个只读的数据库 // db.execSQL("delete from info where name=?", new String[]{name}); int i = db.delete("info", "name=?", new String[]{name}); if (i == 0) { Toast.makeText(this, "删除记录失败", 0).show(); } else { Toast.makeText(this, "删除记录成功", 0).show(); } db.close();}
更新记录
/** * 更新记录 * name:以name字段查询记录 * age:要修改的字段 */public void updateRecord(String name, int age) { SQLiteDatabase db = helper.getReadableDatabase(); // 打开一个只读的数据库 // db.execSQL("update info set age=? where name=?", new String[]{age, name}); ContentValues values = new ContentValues(); values.put("age", age); int i = db.update("info", values, "name=?", new String[]{name}); if (i == 0) { Toast.makeText(this, "更新记录失败", 0).show(); } else { Toast.makeText(this, "更新记录成功", 0).show(); } db.close();}
查询记录
/** * 查询记录 * name:以name字段值查询记录 */public void queryRecord(String name) { SQLiteDatabase db = helper.getReadableDatabase(); // 打开一个只读的数据库 //得到数据库查询的结果集的游标(指针) // Cursor cursor = db.rawQuery("select * from info", null); //查询全部记录 // Cursor cursor = db.rawQuery("select age from info where name=?", new String[]{name}); // Cursor cursor = db.query("info", null, null, null, null, null, null); Cursor cursor = db.query("info", new String[]{"age"}, "name=?", new String[]{name}, null, null, null); List<HashMap<String,int>> list = new ArrayList<HashMap<String,int>>(); while (cursor.moveToNext()) { HashMap<String,int> hm = new HashMap<String,int>(); hm.put("name", cursor.getString(cursor.getColumnIndex("name"))); hm.put("age", cursor.getInt(cursor.getColumnIndex("age"))); list.add(hm); hm = null; } cursor.close(); db.close();}
事务操作(银行转账等相关需要同步操作数据库的事务)
public void execTransaction(String name1, String name2) { SQLiteDatabase db = helper.getWritableDatabase(); db.beginTransaction(); try { // 转账 db.execSQL("update info set money=money-100 where name =?", new String[]{name1}); // 收到转账 db.execSQL("update info set money=money+100 where name =?", new String[]{name2}); // 标识事务执行成功,如果没有执行下面的代码,数据会回滚 db.setTransactionSuccessful(); } catch(Exception ex) { ex.printStackTrace(); Log.i("rixin", "事务处理失败"); } finally { db.endTransaction(); //关闭事务 db.close(); //关闭数据库 }}
值得注意的是:操作完数据库后要记得关闭数据库,使用完Cursor对象后,也应及时关闭,否则会造成内存泄漏
利用sqlite3工具查看数据库的内容
sqlite3 xxx.db (进去后输入sql语句查询即可)
如果出现中文乱码 需要修改cmd的编码集,默认是gb2312
chcp 65001 (更改cmd窗口的编码的DOS命令,65001是utf-8)
adb shell (挂载到Linux的空间)cd data/data/<packagename>/databases (进入应用的databases目录下)ls -l (列出当前目录下的所有文件的详细信息)sqlite3 xxx.db select * from info; (SQL语句查询,记得加上分号" ; "结束)
如果觉得使用命令来查看数据库表麻烦,也可以google搜索下载可以查看SQLite数据库的软件。导出数据库文件到电脑后即可使用软件来查看数据库里面的信息。
希望以上的内容对你们有所帮助吧
- Android复习之旅--SQLite
- Android复习之旅--Intent
- Android复习之旅--Activity
- Android复习之旅--SharePreferences
- Android复习之旅--ContentProvider
- Android复习之旅--BroadcastReceiver
- Android期末复习(4) SQLite 数据库
- sqlite复习
- Android复习之旅--常用布局
- Android复习之旅--文件存储
- Android复习之旅--简单使用Dialog
- Android复习之Scroller
- Android复习之布局
- Android复习之CheckBox
- Android复习之RatingBar
- Android复习之ImageView
- Android复习之ImageButton
- Android复习之GridView
- Leetcode
- CSDN-markdown语法——缩进、图片居中、字体、字号与颜色
- 关于c#调用c++dll问题
- 苏嵌5 16.11.3
- 大数据Hadoop基础
- Android复习之旅--SQLite
- Linux网络编程——tcp实例
- JavaGC 回收相关
- Think from long term
- Arduino 驱动OLED屏幕IIC接线方式简单入门
- 2.jsp中input文本标签文本变更Onpropertychange事件案例
- AutoLayout学习资料集锦
- (笔记)关于集合中ArrayList例子
- Leetcode3 : Longest Substring Without Repeating Characters