在实际项目编码中,大家可能经常用到sharepreference和sqlite用于数据存储,其底层原理都是以文件的形式进行存储。今天我们就来讲讲sqlite存储的使用。使用过数据库的小伙伴们对sqlite的使用应该能够很快上手。见代码。
在操作sqlite数据库时,一共用到三个类:SQLiteOpenHelper,SQLiteDatabase,Cursor(结果集)。一共包含五种数据类型:NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象),但是在编码的时候像弱语言,varchar等数据类型也能识别,可能是自动转换成text数据类型了。所以我比较习惯用sql命令来操作,减少了很多麻烦。
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by qiang.lin,NULL,INTEGER,REAL(浮点数),TEXT(字符串文本)和BLOB(二进制对象)
*/
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
private static final String DATA_NAME = "user.db";
private static final int VERSION=1;
public MySQLiteOpenHelper(Context context) {
super(context, DATA_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE user(id VARCHAR(10) NOT NULL,name VARCHAR(10) NOT NULL, password VARCHAR(10) NOT NULL,PRIMARY KEY(id));";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("----版本迭代的时候会使用", "---");
}
}
这是一个SQLDataBase的管理类,对操作进行管理。db和cursor要及时关闭,否则会导致内存溢出。我只写了sql语句的操作,因为我感觉这个比较简单明了,有sql基础的小伙伴一看便知。
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import example.com.mvpdesign.sqlite.MySQLiteOpenHelper;
/**
* Created by qiang.lin
*/
public class DataBaseManager {
private static final String TAG = DataBaseManager.class.getSimpleName();
private static DataBaseManager dataBaseManager;
private MySQLiteOpenHelper mySQLiteOpenHelper;
private SQLiteDatabase sqLiteDatabase;
private DataBaseManager(Context context) {
mySQLiteOpenHelper = new MySQLiteOpenHelper(context.getApplicationContext());
}
/**
* 单例模式
*
* @return 对象
*/
public static DataBaseManager getInstance(Context context) {
if (dataBaseManager == null) {
synchronized (DataBaseManager.class) {
if (dataBaseManager == null) {
dataBaseManager = new DataBaseManager(context);
}
}
}
return dataBaseManager;
}
/**
* 增删改
*
* @param sql
* @param bindArgs 占位符值
* @return 成功or失败
*/
public boolean executeSQL(String sql, Object[] bindArgs) {
sqLiteDatabase = mySQLiteOpenHelper.getWritableDatabase();
try {
sqLiteDatabase.execSQL(sql, bindArgs);
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
sqLiteDatabase.close();
}
return true;
}
/**
* cursor是结果集,查询
*
* @param sql
* @param bindArgs 占位符的值
*/
public Cursor selectSQL(String sql, String[] bindArgs) {
sqLiteDatabase = mySQLiteOpenHelper.getReadableDatabase();
Cursor cursor = null;
try {
cursor = sqLiteDatabase.rawQuery(sql, bindArgs);
if (cursor != null && cursor.getCount() > 0) {
return cursor;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
} finally {
cursor.close();
sqLiteDatabase.close();
}
return null;
}
}
插入操作
boolean flag = DataBaseManager.getInstance(SqliteActivity.this).executeSQL("insert into user(id,name,password) values(?,?,?);", new String[]{"1", "李四", "234"});
删除操作
boolean flag=DataBaseManager.getInstance(SqliteActivity.this).executeSQL("delete from user where id=? ", new String[]{"1"});
修改操作
boolean flag=DataBaseManager.getInstance(SqliteActivity.this).executeSQL("update user set name=? where id=?;", new String[]{"张三", "1"});
查询操作
StringBuffer sb = new StringBuffer();
Cursor cursor=DataBaseManager.getInstance(SqliteActivity.this).selectSQL("select * from user where id=?;",new String[]{"10"});
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String password = cursor.getString(cursor.getColumnIndex("password"));
sb.append("id:" + id + "----" + "name:" + name + "------" + "password:" + password);
Log.i("数据库------", sb.toString());
}
}
cursor.close();
事务,两个或以上的操作相互关联操作,如果其中一个失败了,将会事务回滚,该次操作回到进入时的数据状态,操作失败。
public void transactionData() {
sqLiteDatabase.beginTransaction();
try {
sqLiteDatabase.execSQL("update user set name=? where id=?;", new String[]{"王五", "8"});
sqLiteDatabase.execSQL("update user set name=? where id=?;", new String[]{"李四", "8"});
sqLiteDatabase.setTransactionSuccessful();
} catch (SQLException e) {
e.printStackTrace();
} finally {
sqLiteDatabase.endTransaction();
sqLiteDatabase.close();
}
}
到此SQLite的使用就完成了,其实操作也是很简单的,运行完成后,会在data/data/com.example.项目名/ 生成 一个user.db文件,可以通过shell命令查看,配置adb。也可以用第三方软件导出查看(SQLiteExpert.zip),小编是用该软件打开。后来发现其实在使用虚拟机的时候,虚拟机支持直接代开sqlite文件,所以直接打开就可以看到库表。
如果你的sql基础不是很好,可以试一试用第三方的开源框架,如litepal,该框架小编是在朋友的推荐下看了下,使用起来还是很简单便捷的。
总结:1、感觉Manger管理类设计的不是很合理,如果小伙伴们有更好的设计思路,可以提供给小编。
2、相比于数据库,sqlite的操作还是比较简单便捷的。就是到生成文件找了一会。