自学Android编程一段时间了,就想自己写一个游戏辅助类APP练手,其中需要实现一个图鉴查询的功能。在实现查询功能之前,肯定是要把相关的数据保存下来以供查询使用,由于数据量比较大而且类型很多,博主就想到了Android自带的SQLite。由于博主也是刚开始学习,对于SQLiteOpenHelper类还是相当模糊,于是就开始学习并做了一些整理。
public class OptimizedOpenHelper extends SQLiteOpenHelper {
private final Context mcontext;
private final static String TABLE_NAME = "table_test";
private final static String ID = "id";
private final static String NAME = "name";
private String sql_create = "CREATE TABLE " + TABLE_NAME + " (" + ID
+ " INTEGER primary key autoincrement, " + NAME + " text);";//建表语句,表名:table_test,列:id(主键)、name
public OptimizedOpenHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
this.mcontext=context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(sql_create);//创建表格test.db
String fileName = "initial_db.txt";//建表时所需插入数据保存在这个文件
try {
renewDB(db,fileName);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//按行读取assets/fileName中的语句,并用execSQL执行
private void renewDB(SQLiteDatabase db,String fileName) throws IOException{
InputStream in = mcontext.getResources().getAssets().open(fileName);
BufferedReader reader =new BufferedReader(new InputStreamReader(in));
String line;
while((line=reader.readLine())!=null){
db.execSQL(line);
}
in.close();
}
//根据oldVersion确定更新数据库所需执行的文件
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion){
case 1:{
String fileName_v2="upgrade_v2.txt";
try {
renewDB(db,fileName_v2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
default:
break;
}
}
}
上面是我新建的一个OptimizedOpenHelper类继承自SQLiteOpenHelper类。重写了onCreate()、onUpgrade()两个方法,并且创建了一个renewDB()的方法用来将保存在assets/file_name.txt中的数据插入数据库。
public class MainActivity extends Activity {
private final static String DATABASE_NAME = "test.db";
private final static int DATABASE_VERSION = 1;
private OptimizedOpenHelper odbHelper;
private Button button_1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
odbHelper=new OptimizedOpenHelper(this, DATABASE_NAME, null, DATABASE_VERSION);//此时数据库并不会创建
button_1=(Button) findViewById(R.id.button_1);
button_1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
odbHelper.getReadableDatabase();
}
});
}
}
这是在MainActivity里调用OptimizedOpenHelper,可以对数据库进行一些操作,可以实现插入数据、查询数据之类的功能。
关于onCreate()、onUpgrade()调用条件做了如下总结:
1、当数据库不存在时,创建新的OptimizedOpenHelper实例时不会调用onCreate()方法创建数据库。
2、当数据库不存在的时候,调用getReadableDatabase()或者getWritableDatabase()方法会回调onCreate()方法创建数据库。
3、当数据库存在,且新版本号大于旧版本号时,调用getReadableDatabase()或者getWritableDatabase()方法会回调onUpgrade()方法会调用以更新数据库。
4、当数据库存在,且版本号未变的情况下onCreate()和onUpgrade()都不会调用。
5、注意版本号是根据新建实例时odbHelper=new OptimizedOpenHelper(this, DATABASE_NAME, null, DATABASE_VERSION)所传入的DATABASE_VERSION来确定。举个例子:如果传入的版本号为2(即DATABASE_VERSION=2),且数据库尚未创建则会调用onCreate()方法创建一个版本号为2的数据库,onUpgrade()方法并不会调用。所以在更新数据库时不管要考虑到onUpgrade()方法中所需要增加的数据,还要考虑到在onCreate()方法中增加同样的数据,以保证新用户创建的数据库是最新版本。
6、单独用txt文件管理数据我觉得比较方便。
大概就是这些了,有什么错误之处欢迎指正。(毕竟博主是刚刚起步的菜鸟~哈哈)