写在前面
看完本文你将掌握以下内容
- 掌握简单 SQL 语法
- 掌握 SQLite 的简单操作
基础知识
SQL 语法
至于什么是 SQL 是什么,额,自行 Google。。总之强大的 SQL 能帮我完成很多功能,最简单的就是数据库增删改查,对一些要求比较高的功能也是在这四种操作基础之上扩展的。
(这里省略了数据库介绍,我们主要介绍 SQLite 使用,so。。MySQL、SQL Server 介绍等就略过了,相信大家都多多少少了解过)
我这里介绍下最简单的四种操作:
1、SELECT
SELECT * FROM test; //从 test 数据库中选取所有列内容
SELECT testid,time FROM test;//从 test 数据库中选取 testid 和 time 列内容
SELECT testid FROM test;////从 test 数据库中选取 testid 列内容
2、INSERT INTO
INSERT INTO test (testid, time) VALUES ('1',xxxxxxx);//插入一行数据
3、UPDATE
UPDATE test SET time = xxxx WHERE testid='1';//更新testid= '1' 的 time 数据
4、DELETE
DELETE * FROM test;//删除所有数据
DELETE FROM test WHERE testid ='2';//删除testid = '2'的行数据
数据的增删改查操作就做一个简单介绍,剩余有需要可以自行深入学习。
SQLite
SQLite 是一个将数据存储到设备上的文本文件的开源SQL数据库,Android 内置了 SQLite 数据库实现,SQLite 支持了关系数据库所有功能,让我们很方便的使用。
Android 中使用数据库所需的 API 在 android.database.sqlite 软件包中提供。
SQLiteOpenHelper
SQLiteOpenHelper 是 Android 中操作数据库重要的类,我们需要继承 SQLiteOpenHelper 类,重写 onCreate() 和 nUpgrade()方法。
例如下面的 TestDBHelper 用于创建数据和检表用,要访问您的数据库,需要实例化 TestDBHelper
TestDBHelper mTestDBHelper = new TestDBHelper(App.getContext());
例如:
public class TestDBHelper extends SQLiteOpenHelper {
private static final int DB_VERSION = 1;
public static final String DB_NAME = "test.db";
public static final String TABLE_NAME = "test";
private static final String COLUMN_ID = "_id";
public static final String COLUMN_ALBUMID = "testid";
public static final String COLUMN_TIME = "time";
public TestDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//如果你的建表语句过多,一定要是用 StringBuilder 来拼接语句,使用 "+" 会消耗性能
StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ");
sb.append(TABLE_NAME)
.append('(')
.append(COLUMN_ID).append(" INTEGER PRIMARY KEY,")
.append(COLUMN_ALBUMID).append(" TEXT,")
.append(COLUMN_TIME).append(" INTEGER")
.append(')');
db.execSQL(sb.toString());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
具体数据类型参考:SQL 数据类型快速参考手册
数据库操作
1、插入数据
通过将一个 ContentValues 对象传递至 insert() 方法将数据插入数据库:
public void insert(String id,long time) {
SQLiteDatabase db = null;
try {
db = mTestDBHelper.getWritableDatabase();
db.beginTransaction();
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_TESTID, id);
contentValues.put(COLUMN_TIME, time);
db.insertOrThrow(TABLE_NAME, null, contentValues);
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (db != null) {
db.endTransaction();
}
}
}
insertOrThrow: the row ID of the newly inserted row, or -1 if an error occurred
还可以通过 db.execSQL() 方法执行一条 SQL 语句,这里就不做示范了。
2、读取数据
public List<NumberModel> getAllData(){
List<NumberModel> list = null;
SQLiteDatabase db = mTestDBHelper.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, null, null,null, null, null, null);
if (cursor == null || cursor.getCount() <= 0){
Log.e(TAG,"getAllData cursor is null or count <=0");
return list;
}
list = new ArrayList<>();
while (cursor.moveToNext()){
NumberModel model = parseNumber(cursor);
list.add(model);
}
Log.d(TAG,"getAllData:"+ list.size() + ",list:" + list);
return list;
}
要从数据库中读取信息,请使用 query() 方法,将其传递至选择条件和所需列.
query(
String table,//表名
String[] columns,// 返回的所需列
String selection,// where 条件
String[] selectionArgs,// where 条件对应的字段
String groupBy, // 过滤器分组,一半null不分组
String having,// 过滤器声明要在游标中包含哪些行组,null无分组
String orderBy// 排序
)
3、删除数据
private int deleteById(String id) {
int count = 0;
SQLiteDatabase db = null;
try {
db = mTestDBHelper.getWritableDatabase();
db.beginTransaction();
String whereClause = COLUMN_TESTID + " = ?";
String[] whereArgs = new String[]{id};
count = db.delete(TABLE_NAME, whereClause, whereArgs);
db.setTransactionSuccessful();
return count;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (db != null) {
db.endTransaction();
}
}
return count;
}
delete 还是比较简单的,whereClause 删除条件,whereArgs 删除条件值数组字段(分别对应条件中的 ?)
4、更新数据
public void update(String id,long time) {
SQLiteDatabase db = null;
try {
db = mTestDBHelper.getWritableDatabase();
db.beginTransaction();
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_TESTID, id);
contentValues.put(COLUMN_TIME, time);
String whereClause = COLUMN_TESTID + " = ?";
String[] whereArgs = new String[]{id};
db.update(TABLE_NAME,contentValues,whereClause,whereArgs);
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (db != null) {
db.endTransaction();
}
}
}
更新操作可将 insert() 的内容值语法与 delete() 的 where 语法相结合
遇到的坑
再项目中遇到和别人公用一个数据库问题,同一个数据库不同的表,起初以为没有什么问题,后来测试就发现某些情况下会找不到数据库表问题,经过分析验证,是有两个 SQLiteOpenHelper,且操作可能不对称,具体异常信息忘记了,后面找到再贴吧,所以,在写数据库相关功能时切记开关数据库,防止发生内存泄露。
总结
简单粗暴的介绍了 SQLite 使用,真正学会使用还需要不断的练习,希望能帮到你。
Github Demo