Android学习笔记整理(14)--数据存储方式之SQLite数据库

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn.net/qq_29477223/article/details/80851552

一、SQLite数据库的简介

        SQLite是一个轻量级数据库,第一个版本诞生于2000年5月。它最初是为嵌入式设计的,占用资源非常少,在内存中只需要占用几百kb的存储空间。这是Android移动设备采用SQLite数据库的原因之一。

        SQLite是遵循ACID关联式的数据库管理系统。这里的ACID指的是数据库事务正确执行的4个基本要素,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。同时SQLite还支持SQL语言、事务处理等功能。

        SQLite由于没有服务器进程,它是通过文件保存数据,该文件是跨平台的,可以放在其他平台中使用。保存数据,支持NULL,INTEGER,REAL(浮点数字),TEXT(字符串文本)和BLOB(二进制对象)5种数据类型。但实际上SQLite也接受varchar(n)、char(n)、decimal(p,s)等数据类型,只不过在运算或保存时回转换成对应的5种数据类型。因此,可以将各种类型的数据保存在任何字段中,而不用关心字段声明的数据类型。这也是SQLite数据库的最大特点。

二、SQLite数据库的使用

  1.SQLiteOpenHelper类

SQLiteOpenHelper是一个抽象类,该类用于创建数据库和数据库版本更新。

SQLiteOpenHelper常用方法

方法名称 功能描述
    pubic SQLiteOpenHelper(Context context,String name,CursorFactory factory,int version)     构造方法,一般需要传递一个创建的数据库名称即name参数,版本号version最小为1
    public void onCreate(SQLiteDatabase db)     创建数据库时调用的方法
    public void onUpgrade(SQLiteDatabase db,int oidVersion,int newVersion)     数据库版本更新时使用
    public SQLiteDatabase getReadableDatabase()     创建或打开一个只读的数据库
    public SQLiteDatabase getWritableDatabase()     创建或打开一个读写的数据库

   2.SQLiteDatabase类

SQLiteDatabase是一个数据库访问类,该类封装了一系列数据库操作的API,可以对数据进行增、删、改、查等操作。

SQLiteDatBase常用方法

方法名称 功能描述
    public long insert(String table,String nullColumnHack,ContentValues values) 添加一条数据,其中的参数分别表名、列名、参数集合
    public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) 查询数据,参数 columns代表列名数据,selection代表查询条件,selectionArgs代表查询参数值,groupBy代表分组,having代表聚合函数,orderBy代表排序
    public Cursor rawQuery(String sql,String[] seletionArgs) 执行带占位符的SQL查询
    public int updata(String table,ContentValues values,String whereClause,String[] whereArgs) 修改特定数据
   public int delete(String table,ContentValues values,String whereClause,String[] whereArgs) 删除表中特定记录
    public void execSQL(String sql,Object[] bingArgs) 执行一条带占位符的SQL语句
    public void close() 关闭数据库

  3.Cursor接口

Cursor是一个有游标接口,在数据库操作中作为返回值,相当于结果集ResultSet。

Cursor常用方法

扫描二维码关注公众号,回复: 3371976 查看本文章

方法名称 功能描述
    boolean moveToNext() 移动光标到下一行
    int getInt(int columnIndex) 获取指定列的整型值
    int getColumnIndex(String columnName) 返回指定列索引值,如果列不存在则返回-1
    String getString(int coulumIndex) 获取指定列的字符串
    boolean moveToFirst() 移动光标到第一行
    boolean moveToLast() 移动光标到最后一行
    boolean moveToPrevious() 移动光标到上一行
    boolean moveToPosition(int position) 移动光标到指定位置
    int getCount() 返回Cursor中的行数
    int getPositioin() 返回当前Cursor的位置
    String getColumnName(int columnIndex) 根据列的索引值获取列的名称
    String[] getColumnName() 获取Cursor所有列的名称和数组

三、数据库的常用操作

    1.创建SQLite数据库

    Andriod系统推荐使用SQLiteOpenHelper的子类创建SQLite数据库,因此需要先创建一个类继承SQLiteOpenHelper,重写onCreate()方法,并在该方法中执行创建数据库的命令

public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {
	public PersonSQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
		super(context, "person.db", null, 5);
	}
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table person (        //初始化数据库表结构,执行一个建表SQL语句
                id integer primary key autoincrement, "+
                "name varchar(20), "+
                "number varchar(20)) ");
	}
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("alter table person add account varchar(20)");
	}
}

 注意,创建的数据库被放置在/data/data/<your package name>/database目录下

    2.增加一条数据

    以person表为例,查person表中添加数据,先要得到一个可读写的SQLiteDatabase对象

public long add(String name,String number){
	SQLiteDatabase db = helper.getWritableDatabase();
        ContentValues values = new ContentValues();    //将参数名和列添加到ContentValues对象里面
	values.put("name", name);
	values.put("number", number);
	long id = db.insert("person", null, values);
	db.close();
	return id;
}

    3.修改一条数据

public int update(String name, String newnumber){
	SQLiteDatabase db = helper.getWritableDatabase();
	ContentValues values = new ContentValues();
	values.put("number", newnumber);    //将参数以key,values的形式添加进去
	int number = db.update("person", values, "name=?", new String[]{name});
	db.close();
	return number;
}

4.删除一条数据

public int delete(String name){
	SQLiteDatabase db = helper.getWritableDatabase();
	int number = db.delete("person", "name=?", new String[]{name});
	db.close();
	return number;
}

5.查询一条数据

查询有两种方式,第一个种是通过query()方法

public boolean find(String name){
	SQLiteDatabase db = helper.getReadableDatabase();
	Cursor cursor = db.query("person", null, "name=?",
             new String[]{name}, null, null, null);
	boolean result = cursor.moveToNext();//是否有下一条值
	cursor.close();
	db.close();
	return result;
}

第二种是通过SQL语句查询

Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name});

查询与增删改不同的是,前面3个操作,都可以用execSQL()方法执行SQL语句,而这里使用rawQuery,因为查询数据库会返回一个结果集Cursor。

在使用完SQLiteDatabase和Cursor对象一定要及时关闭,否则会造成内存泄露

四、SQLite事务操作

        现实生活中,我们经常进行的转账操作,转账操作分为两部分来完成,转入和转出,只有这两部分都完成才认为转账成功。如果转账的时候只有转入成功,会反生两个账户金额不同步。SQLite数据库为了避免,引入了事务。

    要通过使用SQLite的事务来模拟银行转账功能。首先,要得到一个可写的SQLiteDatabase对象,然后开启事务执行转入和转出操作,最后关闭事务。

PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
	SQLiteDatabase db = helper.getWritableDatabase();
	db.beginTransaction();
	try {
		db.execSQL("update person set account=account-1000 where name =?",
					                                new Object[] { "zhangsan" });
		db.execSQL("update person set account=account+1000 where name =?",
					                                  new Object[] { "wangwu" });
		db.setTransactionSuccessful();
	}catch (Exception e) {
		Log.i("事务处理失败", e.toString());
	} finally {
		db.endTransaction();   
		db.close();             
	}
}
注意,事务操作完成后, 一定要使用endTransaction()方法关闭事务,当执行到endTransaction()方法时首先会检查是否有事务执行成功的标记,有则提交数据,无则回滚数据。最后关闭事务,如果不关闭,事务超时才会结束,会降低数据库并发效率。通常放在finally中执行。

猜你喜欢

转载自blog.csdn.net/qq_29477223/article/details/80851552