Android中SQLite学习笔记
2015-11-03 19:23
363 查看
自学Android编程一段时间了,就想自己写一个游戏辅助类APP练手,其中需要实现一个图鉴查询的功能。在实现查询功能之前,肯定是要把相关的数据保存下来以供查询使用,由于数据量比较大而且类型很多,博主就想到了Android自带的SQLite。由于博主也是刚开始学习,对于SQLiteOpenHelper类还是相当模糊,于是就开始学习并做了一些整理。
上面是我新建的一个OptimizedOpenHelper类继承自SQLiteOpenHelper类。重写了onCreate()、onUpgrade()两个方法,并且创建了一个renewDB()的方法用来将保存在assets/file_name.txt中的数据插入数据库。
这是在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文件管理数据我觉得比较方便。
大概就是这些了,有什么错误之处欢迎指正。(毕竟博主是刚刚起步的菜鸟~哈哈)
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文件管理数据我觉得比较方便。
大概就是这些了,有什么错误之处欢迎指正。(毕竟博主是刚刚起步的菜鸟~哈哈)
相关文章推荐
- Android控制台输出js打印的log引发的问题
- 【Android个人向】2015/11/3总结
- 关于Android中的枚举【4种】
- Android怎样将一个工程当做library库被引入到另一个项目中
- android 多线程Thread,Runnable,Handler,AsyncTask等之间的关系
- Android Touch事件传递机制
- 31.Android MVP模式
- android adt23.0.6的文件打包混淆时遇到的问题
- android音频播放简单示例
- Android 高亮变色显示文本中的关键字
- AndroidSweetSheet类库的使用
- android studio adbwifi 调试android程序 告别数据线
- Android 编程下 Touch 事件的分发和消费机制
- Android 编程下 Touch 事件的分发和消费机制
- Android--使用手机GPS获取经纬度
- 如何实现Android应用的启动画面(闪屏)?
- Android知识点——内容提供者和内容观察者ContentProvider ContentResolver
- Android Studio中使用ButterKnife注解框架
- Android中LCD背光驱动
- Android - Glide的使用