您的位置:首页 > 移动开发 > Android开发

Android中SQLite学习笔记

2015-11-03 19:23 363 查看
自学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文件管理数据我觉得比较方便。

大概就是这些了,有什么错误之处欢迎指正。(毕竟博主是刚刚起步的菜鸟~哈哈)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: