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数据库的软件。导出数据库文件到电脑后即可使用软件来查看数据库里面的信息。

希望以上的内容对你们有所帮助吧

0 0
原创粉丝点击