8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
之前简单学习了下SQLite的相关知识,这篇文章我们来看使用SQLite的一个简单的例子,例子中我们会使用如下的三个表格,进行数据库的创建,插入数据,和查询操作。可以到这里下载例子代码
首先,我们需要介绍一下Android中提供的使用SQLite的接口以及使用方法。
###Android中SQLite接口介绍###
SQLiteOpenHelper和SQLiteDatabase是我们在Android提供的与SQLite相关的主要类:SQLiteOpenHelper用于数据库的管理,包括数据库和数据表格的创建,数据库的升级等
SQLiteDatabase主要提供了操作数据的接口,包括插入,查询,执行SQL语句等
SQLiteOpenHelpe
SQLiteOpenHelper类主要用于数据库的创建和版本的管理,当我们的代码试图进行数据库的操作时,SQLiteOpenHelper会检查数据库是否已经创建,如果没有创建,那么将会执行创建数据库的操作;如果已经创建,并且版本正确,那么就会返回给我们数据库的句柄;如果版本不正确,那么就会进行数据库的升级等。类的主要接口如下:public abstract void onCreate(SQLiteDatabase db);当数据库被创建时会执行onCreate方法,在这个方法内部我们应当创建数据库的各种表格。
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);当我们的数据库需要升级时,onUpgrade方法将会被调用,onUpdate的职责是根据新的数据库模型,创建新的表格,遗弃旧的表格,并在必要时将就的数据库当中的数据放入新的表格当中。
此外还需要说明一点,SQLiteOpenHelper的构造方法中都需要一个Version,表示数据库的版本号,当我们从app store下载新的app版本时,SQLiteOpenHelper如果检测到本地版本号不符,就会执行onUpgrade方法进行数据库升级。
从上面的接口可以看到,SQLiteOpenHelper为一个抽象类,因此在实际的使用过程中,我们需要继承它,并重写以上两个函数方能使用。
SQLite接口的使
继承SQLiteOpenHelper,并重写相关的抽象方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class extends SQLiteOpenHelper{
public final static String DATABASE_NAME="library";
public final static int DATABASE_VERSION=1;
public (Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db){
db.execSQL(DBGeneric.CREATE_STUDENT_TABLE);
db.execSQL(DBGeneric.CREATE_BOOK_TABLE);
db.execSQL(DBGeneric.CREATE_RENT_TABLE);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
}
}
我们暂时只重写onCreate方法,onUpgrade我们之后会详细描述。
可以看到,onCreate方法中,我们只执行了一些SQL语句,进行了create table的操作。其中create student table和像table中插入数据的代码段如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public final static String CREATE_STUDENT_TABLE ="CREATE TABLE " +
STUDENT_TABLE_NAME + " ( " + KEY_ID + " TEXT PRIMARY KEY, " +
STUDENT_NAME + " TEXT, " +
STUDENT_TEL + " TEXT " +" ) ";
//method used to insert new row to student table
public void addNewStudentInfo(String id, String name, String tel){
SQLiteDatabase db = mSqliteOpenHelper.getWritableDatabase();
String insertNewInfo = "INSERT INTO " + DBGeneric.STUDENT_TABLE_NAME +
" ( " + DBGeneric.KEY_ID + ", " + DBGeneric.STUDENT_NAME +
", " + DBGeneric.STUDENT_TEL + " ) VALUES ( " + "'" + id + "'" + ", " +
"'" + name + "'" + ", " + "'" + tel + "'" + " )";
db.execSQL(insertNewInfo);
}
可以看到,我们利用getWritableDatabase()得到数据库的句柄,然后再利用SQLiteDataBase的接口就行数据库的操作,同样如果你要做查询,可以调用getReadableDataBase()。getWritableDatabase会对数据库示例进行加锁,因此如果仅仅是查询,一定要用getReadable*方法,以提高数据库使用的效率。还需提醒一点,当我们不在使用数据库时,##需要调用SQLiteOpenHelper的close()方法`,来关闭打开的数据库连接。
rent_info表中存储了图书出借信息,包括学生的id和图书的id,下面的查询的例子就是根据数据库中的三张表,显示出学生的姓名,以及其借出的图书名:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public void Test(){
Cursor c;
String test = "SELECT stu."+DBGeneric.STUDENT_NAME+", book."+DBGeneric.BOOK_NAME+" FROM "
+ DBGeneric.STUDENT_TABLE_NAME + " stu," + DBGeneric.BOOK_TABLE_NAME
+ " book," + DBGeneric.RENT_INFO_TABLE_NAME + " rent "
+ "WHERE stu."+DBGeneric.KEY_ID + "= rent." + DBGeneric.RENT_STUDENT_ID
+ " AND book." + DBGeneric.KEY_ID + " = rent." + DBGeneric.RENT_BOOK_ID;
c = mSqliteOpenHelper.getReadableDatabase().rawQuery(test, null);
if (c != null)
c.moveToFirst();
do {
Log.i("DJ", c.getString(0) + " " + c.getString(1));
}while (c.moveToNext());
}
其实SQLite的使用仍然是普通的数据库操作,执行sql语句,得到游标,遍历得到结果。虽然SQLite是简化的SQL,但是对于插入和查询的,join操作,以及Count等函数操作仍然是支持的。
onUpdate方法的使用
在我们的app升级时,往往会增加新的功能,而数据库表格往往也会有新的schema,因此onUpdate方法的正确实现尤为重要,如果你无需保存之前数据库的内容,那么可以使用下面的方法:1
2
3
4
5
6
7
8public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
//delete old tables
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
//create new tables with new schema
onCreate(db);
}
但是大多数情况下,我们需要保存已有的数据,StackOverflow上有一个帖子,很详细的说明了onUpdate的正确实现步骤。
关于本文的demo
本文的小demo中使用了Android Navigation Drawer模式,可以说是Navigation Drawer实现的标准方式,有兴趣的话建议学习一下,代码很简明易懂。
附上一个很好地SQLite的帮助网站