Android中SQLite学习笔记

来源:互联网 发布:云计算未来带来的好处 编辑:程序博客网 时间:2024/04/29 11:08

自学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(主键)、namepublic OptimizedOpenHelper(Context context, String name, CursorFactory factory, int version) {super(context, name, factory, version);this.mcontext=context;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(sql_create);//创建表格test.dbString fileName = "initial_db.txt";//建表时所需插入数据保存在这个文件try {renewDB(db,fileName);} catch (IOException e) {// TODO Auto-generated catch blocke.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确定更新数据库所需执行的文件@Overridepublic 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 blocke.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;@Overrideprotected 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(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubodbHelper.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文件管理数据我觉得比较方便。

大概就是这些了,有什么错误之处欢迎指正。(毕竟博主是刚刚起步的菜鸟~哈哈)

1 0
原创粉丝点击