首先说二点说明:本文重点在代码上,代码每一步都要注释
其次:对于数据库的操作最后的数据查看,可以借助Sqlite expert 工具!同时对于数据库的操作,可以直接编写sql语句执行
以下为代码:
数据库的创建及升级
public class MyDataBaseHelper extends SQLiteOpenHelper {
private Context mContext;
/**
* integer 表示整型
* real 表示浮点型
* text 表示文本型
* blob 表示二进制类型
* primary key 表示设为组件 autoincrement表示自增长
* */
public static final String CREAE_BOOK = "create table Books("
+"id integer primary key autoincrement,"
+"author text ,"
+"price real,"
+"pages integer,"
+"name text)";
public static final String CREAE_CATEGORY = "create table Categorys("
+"id integer primary key autoincrement,"
+"cate_name text ,"
+"cate_code integer)";
/**
* 构造器参数:
* 第二个参数:数据库名,创建数据库时使用
* 第三个参数:我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null
* 第四个参数:表示当前数据库的版本号,用于升级数据库操作。构建SQLiteOpenHelper的实例后,再调用它的
* getWritableDatabase()或getReadableDatabase()方法就能够创建数据库了,数据库文件会 存放在
* /data/data/<package_name>/databases/目录下,此时重写的onCreate方法也会得到执行
* */
public MyDataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext = context;
}
/**
* 当数据库成功创建后,再次调用onCreate()方法时,是不会生效的
* @param db
* 通过File Explorer是无法查看到book表,但是能够看到数据库book.db文件,通常会有二个
* 一个是我们自己产生的,一个是book.db-journal 让数据库能够支持事务而产生的临时文件
*/
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库表
db.execSQL(CREAE_BOOK);
db.execSQL(CREAE_CATEGORY);
Toast.makeText(mContext,"创建数据库成功",Toast.LENGTH_LONG).show();
}
/**
* 升级数据库:直接在onCreat()方法里面调用db.execSQL("")新的数据库表是不会创建的
* 只有在创建数据库构造器的时候,将新的数据库的版本大于旧的数据库版本即可
* 同时执行db.execSQL("drop table if exists <db_tabalname>");即数据库中如果
* 存在该表,就将该表删除,然后再创建该表(但是有个问题:表删除了,数据也就没有了),所以有个方法可以保证升级数据库时,保证数据库数据不变。如下
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Books");
db.execSQL("drop table if exists Categorys");
//重新执行创建数据库表
onCreate(db);
}
//升级数据库保证数据库数据不遗失,判断旧版本的版本号,然后去执行sql,不用先删除
switch(oldVersion){
case 3:
db.execSQL("alter table Books add column category_id integer");
default:
}
具体对数据库的CRUD操作:
/**
* 创建数据库:getWriteableDatabase()和getReadableDatabase()这二个方法都可以创建或者打开一个现有
* 的数据库(如果已存在,则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。
* 其区别是:当数据库不可写入的时候(如磁盘已满),getReadableDatabase()方法对象将只以读的方式打开数据库
* 而getWriteableDatabase()方法则将出现异常
*/
mMyDataBaseHelper = new MyDataBaseHelper(this, "book.db", null, 3);
mCreateDB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//SQLiteDatabase对象 用于操作CRUD数据库
mMyDataBaseHelper.getWritableDatabase();
}
});
/**
* 添加数据
*/
mAddData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ContentValues values = new ContentValues();
SQLiteDatabase DB = mMyDataBaseHelper.getWritableDatabase();
values.put("name","The Da Vinci Code");
values.put("author","Dan Brown");
values.put("pages",454);
values.put("price",16.98);
/**插入第一条数据 参数分别是数据库表名 未赋值的的列设置为空 具体的内容值的对象
同时这里需要注意SQLiteDatabase对象不能用创建数据库时的对象,否则会报空指针异常
需要重新创建对象
*/
DB.insert("Books",null,values);
values.clear();
values.put("name","The Lost Symbol");
values.put("author","Dan Brown");
values.put("pages",510);
values.put("price",18.88);
//插入第二条数据
DB.insert("Books",null,values);
Toast.makeText(MainActivity.this,"插入数据成功",Toast.LENGTH_SHORT).show();
}
});
/**
* 更新数据
* 更新名字为the da vinci code 的价格为11.11
*/
mUpData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = mMyDataBaseHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("price","11.11");
db.update("Books",contentValues,"name = ?",new String[]{"The Da Vinci Code"});
}
});
/**
* 删除数据
*/
mDelData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = mMyDataBaseHelper.getWritableDatabase();
db.delete("Books","pages > ?",new String[]{"500"});
}
});
/**
* 查询数据,其参数最少也是7个
* query()方法参数 对应SQL部分 描述
* table from table_name 指定查询的表名
* columns select column1,column 指定查询的列名
* selection where column = value 指定where的约束条件
* selectionArgs -- 为where中的占位符提供具体的值
* groupBy group by column 指定需要group by的列
* having having column = value 对group by后的结果进一步约束
* orderBy order by column1,coulumn2 指定查询结果的排序方式
*/
mQurData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = mMyDataBaseHelper.getWritableDatabase();
Cursor cursor = db.query("Books", null, null, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
do {
//遍历cuusor对象
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
Log.e("TAG","name"+name);
Log.e("TAG","author"+author);
Log.e("TAG","pages"+pages);
Log.e("TAG","price"+price);
} while (cursor.moveToNext());
}
if(cursor != null) {
cursor.close();
}
}
});
}
以上:就是一些基础的操作。
第三方的数据库,推荐使用郭霖的litepal
github地址如下:
https://github.com/LitePalFramework/LitePal