在Android中为了很方便的管理我们的数据库,提供了一个SQLiteOpenHelper的帮助类。首先这个类是一个抽象类,如果想要使用它必须创建一个类去继承它,然后去实现它的抽象方法。其中有两个重要的方法: getReadableDatabase()和getWritableDatabase().这两个方法都可以创建或者打开一个现有的数据库,并且返回一个可对数据库进行读写的对象。然而,如果数据库不可写入了,比如磁盘空间已经满了,这个时候就得使用getReadableDatabase(),它会使用只读的方式打开数据库,然后使用getWritableDatabase()方法就会出现异常,因为已经无法写入,不能以只读只写的方式打开。下面看下一个继承的实例:
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK = "create table Book ("
+ "id integer primary key autoincrement,"
+ "author text,"
+ "price real,"
+ "pages integer,"
+ "name text )";
public static final String CREATE_CATEGORY = "create table Category ("
+ "id integer primary key autoincrement,"
+ "category_name text,"
+ "category_code integer)";
private Context mContext;
public MyDatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) {
super(context,name,factory,version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
sqLiteDatabase.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists Book");
sqLiteDatabase.execSQL("drop table if exists Category");
onCreate(sqLiteDatabase);
}
布局文件中添加一个按钮即可,用于创建数据库,升级数据库写在upgrade函数里面,先将之前的表删除,然后再执行oncreate()函数。 向数据库中添加数据,需要使用到一个Contentvalue,ContentValues 和HashTable类似都是一种存储的机制 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象。ContentValues存储对象的时候,以(key,value)的形式来存储数据。
在忘数据库中插入数据的时候,首先应该有一个ContentValues的对象所以:
ContentValues initial = new ContentValues();
initial.put(key,values);
SQLiteDataBase db ;
db.insert(database_name,null,initialValues);
插入成功就返回记录的id否则返回-1;
则主要的Activity代码为:
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper dbHelper;
private Button createDatabase;
private Button addData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);
createDatabase = findViewById(R.id.create_database);
addData = findViewById(R.id.add_data);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHelper.getWritableDatabase();
}
});
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name","The Da Vinci Code");
values.put("author","Dan Brown");
values.put("pages",454);
values.put("price",16.96);
db.insert("Book",null,values);
values.clear();
//开始组装第二条数据
values.put("name","The Lost Symbol");
values.put("author","Dan Brown");
values.put("pages",510);
values.put("price",19.95);
db.insert("Book",null,values);
}
});
至于删除,更新,查询都是一样的套路,查询要复杂些,它涉及的限制条件更多些,主要是使用query()方法,它会返回一个游标对象,查询到的数据都可以从这个对象取出。使用cursor.getString()方法,当然使用完记得关闭游标,它是比较耗费资源的一个东西。