目录
SQLite
SQLite是Android提供的一款轻量级关系型数据库,具有运行速度快、占用资源小的特点,另外它还支持事务。
一、创建数据库
创建数据库,需要编写一个SQLiteOpenHelper的子类,它是一个抽象类,我们需要实现它的onCreate()和onUpgrade()方法。
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String CREATE_BOOK = "create table book(" +
"id integer primary key autoincrement," +
"name text," +
"author text," +
"price real" +
");";
private Context context;
public MyDatabaseHelper(@Nullable Context context, @Nullable String name,
@Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(MyDatabaseHelper.CREATE_BOOK);
Toast.makeText(context, "Create Database", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
SQLiteOpenHelper提供有getReadableDatabase()和getWriteableDatabase()方法,用于获取数据库实例。当调用它们任何一个时,都会先检测数据库是否已经被创建,如果数据库没有被创建,那么会调用onCreate()创建数据库;如果数据库已经被创建了就不会再调用onCreate()。不同的是,当不能再向数据库中添加数据时(比如没有更多的存储空间),调用getReadableDatabase()返回的数据库实例只能进行读操作,而调用getWriteableDatabase()会抛出异常。
四个参数
另外,还需要提供一个构造函数,最简单的构造函数需要提供四个参数
1. 上下文
2. 数据库名
3. 自定义的Cursor
4. 数据库版本
示例:当点击按钮时,会先检测数据库是否被创建,如果数据库还没有被创建,此时会创建。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabase = findViewById(R.id.create_database);
MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabase = findViewByI创建d(R.id.create_database);
MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
createDatabase.setOnClickListener(view->{
myDatabaseHelper.getWritableDatabase();
});
}
}
createDatabase.setOnClickListener(view->{
myDatabaseHelper.getWritableDatabase();
});
}
}
二、更新数据库
现在已经知道,当数据库已经存在时,就不会调用onCreate()方法创建数据库,如果想向数据库中添加新表该怎么办,这时就用到了onUpdate()。创建SQLiteOpenHelper需要指定数据库的版本,在想更新数据库时可以将版本号调大,此时,就会调用onUpdate()更新数据库。
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String CREATE_BOOK = "create table book(" +
"id integer primary key autoincrement," +
"name text," +
"author text," +
"price real" +
");";
private static final String CREATE_CATEGORY = "create table category(" +
"id integer primary key autoincrement," +
"name text," +
"code integer" +
");";
private Context context;
public MyDatabaseHelper(@Nullable Context context, @Nullable String name,
@Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.context = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(MyDatabaseHelper.CREATE_BOOK);
db.execSQL(MyDatabaseHelper.CREATE_CATEGORY);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists book");
db.execSQL("drop table if exists category");
onCreate(db);
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabase = findViewById(R.id.create_database);
MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
createDatabase.setOnClickListener(view->{
myDatabaseHelper.getWritableDatabase();
});
}
}
SQLite支持的数据类型有:
1. integer,整型
2. text,文本
3. real,浮点
4. blob,二进制
添加数据
添加数据使用Insert(),它接收三个参数,第一个参数是表名;第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL,一般我们用不到这个功能,直接传入null即可;第三个参数是ContentValues,ContentValues提供put(key, value),可以指定列名为key添加数据。
SQLiteDatabase database = myDatabaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", "在细雨中呼喊");
contentValues.put("author", "余华");
database.insert("book", null, contentValues);
修改数据
修改数据使用update(),它接收四个参数:
1. 表名
2. ContentValues
3. 同where语句
4. 给第三个参数中的占位符指定值
SQLiteDatabase database = myDatabaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("price", 12.55);
database.update("book", contentValues, "id = ?", new String[]{"1"});
查询数据
查询数据使用query,它接收七个参数,返回的是Cursor
1. 表名
2. columns,指定要查询的列
3. selection,同where
4. selectionArgs,给第三个参数中的占位符指定值
5. groupBy
6. having
7. orderBy
SQLiteDatabase database = myDatabaseHelper.getWritableDatabase();
Cursor cursor = database.query("book", null, null, null, null, null, null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.d(TAG, "name:" + name);
Log.d(TAG, "author:" + author);
Log.d(TAG, "price:" + price);
}
cursor.close();
删除数据
删除数据使用delete(),它接收三个参数
1. 表名
2. selection,同where
3. slectionArgs,给第三个参数中的占位符指定值
SQLiteDatabase database = myDatabaseHelper.getWritableDatabase();
database.delete("book", "id = ?", new String[]{"1"});