SQlite存储
简介
SQLite是android内置的数据库,SQLite是一款轻量级的***关系型***数据库,因占用资源少,运算速度快,因此很适合在移动设备上使用。
内容
创建数据库
- android提供了一个SQLiteOpenHelper(抽象类)帮助类来更方便的管理数据库。
- 创建一个类继承自SQLiteOpenHelper类。并重写两个抽象方法:onCreate()和onUpgrade(),这两个方法分别用来创建和升级数据库。
- SQLiteOpenHelper类有四个构造方法可供重写,一般使用参数少一点的那个构造方法。这个构造方法接收四个参数:第一个参数是Context;第二个参数是数据库名;第三个参数允许我们在查询数据时返回一个自定义的Cursor,一般直接传入null;第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。
// @param上下文用于定位数据库的路径
// @param数据库文件的名称,或者对于内存数据库为null
// @param工厂用于创建游标对象,或null用于默认值
// @param数据库的版本号(从1开始);如果数据库较旧,
// {@link #onUpgrade}将用于升级数据库;如果数据库较新,{@link #onDowngrade}将用于降级数据库
public SQLiteOpenHelper(@Nullable Context context, @Nullable String name,
@Nullable CursorFactory factory, int version) {
this(context, name, factory, version, null);
}
// @param上下文用于定位数据库的路径
// @param数据库文件的名称,或者对于内存数据库为null
// @param工厂用于创建游标对象,或null用于默认值
// @param数据库的版本号(从1开始);如果数据库较旧,
// {@link #onUpgrade}将用于升级数据库;如果数据库较新,{@link #onDowngrade}将用于降级数据库
@param errorHandler在sqlite报告数据库损坏时使用的{@link DatabaseErrorHandler},或使用默认错误处理程序为null。
public SQLiteOpenHelper(@Nullable Context context, @Nullable String name,
@Nullable CursorFactory factory, int version,
@Nullable DatabaseErrorHandler errorHandler) {
this(context, name, factory, version, 0, errorHandler);
}
// @param上下文用于定位数据库的路径
// @param数据库文件的名称,或者对于内存数据库为null
// @param数据库的版本号(从1开始); 如果数据库较旧,
// {@link #onUpgrade}将用于升级数据库; 如果数据库较新,{@link #onDowngrade}将用于降级数据库
// @param openParams配置参数,用于打开{@link SQLiteDatabase}。
// 请注意,当帮助程序打开数据库时,将始终设置{@link SQLiteDatabase#CREATE_IF_NECESSARY}标志
public SQLiteOpenHelper(@Nullable Context context, @Nullable String name, int version,
@NonNull SQLiteDatabase.OpenParams openParams) {
this(context, name, version, 0, openParams.toBuilder());
}
// 与{@link #SQLiteOpenHelper(Context,String,CursorFactory,int,DatabaseErrorHandler)}相同
// 但也接受整数minimumSupportedVersion,以方便升级不再受支持的此旧数据库。
// 如果找到具有minimumSupportedVersion的旧版本的数据库,则只需将其删除,并使用给定的名称和版本创建新数据库
public SQLiteOpenHelper(@Nullable Context context, @Nullable String name,
@Nullable CursorFactory factory, int version,
int minimumSupportedVersion, @Nullable DatabaseErrorHandler errorHandler) {
this(context, name, version, minimumSupportedVersion,
new SQLiteDatabase.OpenParams.Builder());
mOpenParamsBuilder.setCursorFactory(factory);
mOpenParamsBuilder.setErrorHandler(errorHandler);
}
- 调用SQLiteOpenHelper实例的getReadableDatabase()或getWritableDatabase()方法打开数据库(若不存在,则创建)
当数据库不可写入时,getReadableDatabase()方法返回的对象将以只读方式打开数据库,getWriteableDatabase()方法则抛出异常
- 数据库建表语句
//Book表的建表语句 create table Book ( id integer primary key autoincrement, author text, price real, pages integer, name text) //integer表示整型,text表示文本类型,real表示浮点型 //使用primary key将id设为主键 //用autoincrement关键字表示id列是自增长的
- 调用SQLiteDatabase的execSQL()方法执行建表语句,传入字符串建表语句即可
- 升级数据库只需要将创建SQLiteDatabase对象是传入的版本号设置为比原来高就行,在onUpgrade()方法中执行数据库升级操作
基本操作(CURD)
数据库的操作无疑增删改查四个操作,getReadableDatabase()或getWritableDatabase()方法会返回一个SQLiteDatabase对象,通过这个对象进行数据的CRUD(增查更删)操作
- insert():添加数据,该方法接受三个参数:
- 第一个参数:表名
- 第二个参数用于在未指定添加数据的情况下给某些为空的列自动赋值NULL,一般用不到,传入null即可
- 第三个参数是一个ContentValues对象,通过它的put()重载来向ContentValues中添加数据,只需将表中的每个列名以及相应的待添加数据传入即可
- update():更新数据,该方法接收四个参数:
- 第一个参数:表名
- 第二个参数: ContentValues对象,存放更新的数据
- 第三四个参数: 约束更新某行或某几行的数据,不指定默认更新所有行
- delete():删除数据,该方法接收三个参数
- 第一个参数:表名
- 第二三个参数:约束删除某行或某几行的数据,不指定默认删除所有行
- query():查询数据,该方法最少接收七个参数,返回一个Cursor对象,查询到的所有对象从这个对象中取出
- table:表名
- columns:列名
- selection:指定where的约束条件
- selectionArgs:为where中的占位符提供具体的值
- groupBy:指定需要group by的列
- having:对group by后的结果进一步约束
- orderBy:指定查询结果的排序方式
实例
对数据库进行增删改查操作,并对数据库进行更新(给表增加一个属性)
public class MySQliteHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table book(bookId integer primary key autoincrement,bookName text);";
public static final String CREATE_NEWBOOK = "create table book(bookId integer primary key autoincrement,bookName text,author text);";
// 对表重命名
public static final String CREATE_TEMP_BOOK = "alter table book rename to temp_book";
// 注意' '是为新加的字段插入默认值的必须加上,否则就会出错)。
public static final String INSERT_DATA = "insert into book select *, ' 'from temp_book";
public static final String DROP_DATA = "drop table temp_book";
private Context mContext;
public MySQliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "创建数据库成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(CREATE_TEMP_BOOK);
db.execSQL(CREATE_NEWBOOK);
db.execSQL(INSERT_DATA);
db.execSQL(DROP_DATA);
Toast.makeText(mContext, "更新数据库成功", Toast.LENGTH_SHORT).show();
}
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
public static final String TAG = "MainActivity";
private SQLiteDatabase mSQLiteDatabase;
private MySQliteHelper mySQliteHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mySQliteHelper = new MySQliteHelper(this, "test", null, 1);
Button creatDatabase = findViewById(R.id.creat_database);
creatDatabase.setOnClickListener(this);
findViewById(R.id.creat_database).setOnClickListener(this);
findViewById(R.id.add_data).setOnClickListener(this);
findViewById(R.id.updata_data).setOnClickListener(this);
findViewById(R.id.delete_data).setOnClickListener(this);
findViewById(R.id.query_data).setOnClickListener(this);
findViewById(R.id.updata_sql).setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.creat_database:
mSQLiteDatabase = mySQliteHelper.getWritableDatabase();
break;
case R.id.add_data:
ContentValues contentValues = new ContentValues();
contentValues.put("bookName", "test");
mSQLiteDatabase.insert("book", null, contentValues);
Cursor cursor = mSQLiteDatabase.query("book", null, "bookId=?", new String[]{"1"}, null, null, null);
if(cursor.moveToFirst()) {
Log.d(TAG, "name:"+cursor.getString(cursor.getColumnIndex("bookName")));
}
break;
case R.id.updata_data:
ContentValues contentValues1 = new ContentValues();
contentValues1.put("bookName", "yjh");
mSQLiteDatabase.update("book", contentValues1, "bookName=?", new String[]{"test"});
Cursor cursor4 = mSQLiteDatabase.query("book", null, "bookId=?", new String[]{"1"}, null, null, null);
if(cursor4.moveToFirst()) {
Log.d(TAG, "name:"+cursor4.getString(cursor4.getColumnIndex("bookName")));
}
break;
case R.id.delete_data:
mSQLiteDatabase.delete("book", "bookName=?", new String[]{"yjh"});
Cursor cursor3 = mSQLiteDatabase.query("book", null, null, null, null, null, null);
if (cursor3.moveToFirst()) {
do {
String bookId = cursor3.getString(cursor3.getColumnIndex("bookId"));
String bookName = cursor3.getString(cursor3.getColumnIndex("bookName"));
Log.d(TAG, "book:"+"id"+bookId+";name"+bookName);
} while (cursor3.moveToNext());
}
break;
case R.id.query_data:
Cursor cursor2 = mSQLiteDatabase.query("book", null, null, null, null, null, null);
if (cursor2.moveToFirst()) {
do {
String bookId = cursor2.getString(cursor2.getColumnIndex("bookId"));
String bookName = cursor2.getString(cursor2.getColumnIndex("bookName"));
Log.d(TAG, "book:"+"id"+bookId+";name"+bookName);
} while (cursor2.moveToNext());
}
break;
case R.id.updata_sql:
mySQliteHelper = new MySQliteHelper(this, "test", null, 2);
mSQLiteDatabase = mySQliteHelper.getWritableDatabase();
default:
break;
}
}
}