在前面使用SQLite3的时候,并没有留意到有SQLiteOpenHelper这个类,所以只好在Activity里面去创建和维护数据库跟数据表的创建。

但是,现在有了SQLiteOpenHelper这个类,就可以把数据库和数据表,以及一些初始化的数据的维护跟Activity分开了。。。

数据库和数据表结构的创建,是只需要执行一次的,而打开数据库获取数据库相应的SQLiteDatabase操作类则有可能是每次运行程序都需要执行的,如何把这两个步骤操作合理的放到一个辅助类里面呢?SQLiteOpenHelper!木错!就是这个类,只需要继承这个类,调用构造函数SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)然后重写onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)这两个方法即可(不过好像我只是使用了onCreate...)。

下面说一下这个类的大概原理,假设你的SQLiteHelper继承于SQLiteOpenHelper类,调用SQLiteOpenHelper的构造函数并且实现了onCreate和断onUpgrade,当你在程序中调用getWritableDatabase()方法的时候,会自动去检查你的databases目录,如果里面不存在你需要打开的数据库文件,则会自动调用你所写的方法onCreate,然后返回你所创建的数据库表象,如果已经存在则会直接返回该数据库的表象。这样,我们初始化的数据库表,跟默认数据就可以放到onCreate函数里面去实现。。。

继承的类构造函数里面必须调用父类(SQLiteOpenHelper)的构造函数SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)。

context是为打开创建数据库库用的,name是数据库的文件名称,factory设置为空使用默认的,version是创建或打开的数据库的版本号,这个必须大于等于1

如果这一次的version版本和上一次打开的version不一致的时候,SQLiteOpenHelper就会自动调用onUpgrade方法。。

对了,在Activity中,如果打开了数据库,一定要记得关闭!!!

测试SQLiteOpenHelper的一个代码框架,

SQLiteHelper.java

    package com.Yao_GUET.test;  

    import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; /**
* SQLite3数据库辅助类
* @author Yao.GUET
* blog: http://blog.csdn.net/Yao_GUET
* date: 2011-07-06
*/ public class SQLiteHelper extends SQLiteOpenHelper {
private final static String TAG = "SQLiteHelper"; public SQLiteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
Log.e(TAG, "SQLitehelper onCreate!");
try {
db.execSQL("Create TABLE Data( " +
"ID integer Primary Key AUTOINCREMENT, " +
"UserName varchar(50) " +
")");
Log.e(TAG, "createDataTable OK!");
} catch (SQLException se) {
se.printStackTrace();
}
} @Override
public void onOpen(SQLiteDatabase db) {
// TODO Auto-generated method stub
Log.e(TAG, "SQLiteHelper on Open!");
super.onOpen(db);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Log.e(TAG, "SQLitehelper onUpgrade!");
} }

测试Activity

SQLiteHelperTest.java

    package com.Yao_GUET.test;  

    import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.TextView; public class SQLiteHelperTest extends Activity {
private final static String TAG = "SQLiteHelperTest"; private SQLiteHelper sqlHelper;
private SQLiteDatabase db; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.sqlitehelper_test); sqlHelper = new SQLiteHelper(this, "test2.db", null, 2);
db = sqlHelper.getWritableDatabase();
} @Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.e(TAG, "onDestroy!");
if (db != null)
db.close();
super.onDestroy();
} @Override
protected void onPause() {
// TODO Auto-generated method stub
Log.e(TAG, "onPause");
super.onPause();
}
}

可以按照如下的思路来操作,sqlite数据库,

public class MainActivity extends Activity {
private final static String TAG = "SQLiteHelperTest"; private SQLiteHelper sqlHelper;
private SQLiteDatabase db; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); sqlHelper = new SQLiteHelper(this, "test.db", null, 1);
db = sqlHelper.getWritableDatabase();
//如果不存在这个表,那么创建
db.execSQL("Create TABLE if not exists MyData( " +
"ID integer Primary Key AUTOINCREMENT, " +
"UserName varchar(50) not null,"+
"Password varchar(50) not null,"+
"expire TEXT not null"+
")");
//插入数据
db.execSQL("insert into MyData(UserName,Password,expire) values('abc','abc','2018-03-13 00:00:00')");
//修改数据
db.execSQL("update MyData set UserName='def' where ID=1");
db.close();
//查询数据
db=sqlHelper.getReadableDatabase();
Cursor cursor= db.rawQuery("select * from MyData", null);
while(cursor.moveToNext()){
int index= cursor.getColumnIndex("ID");
int id= cursor.getInt(index);
index=cursor.getColumnIndex("UserName");
String name=cursor.getString(index);
index=cursor.getColumnIndex("Password");
String password=cursor.getString(index);
index=cursor.getColumnIndex("expire");
String expire=cursor.getString(index);
Log.i("info", id+","+name+","+password+","+expire);
}
db.close(); }
}

Sqlite数据库的文件路径是 /data/data/包名/databases/数据库名,可以看出在sqllite中,是以每个数据库名作为一个文件进行存储的。需要注意的是data/data文件夹下的内容必需在手机root之后才能看见。

最新文章

  1. jQuery切换网页皮肤保存到Cookie实例
  2. 动态计算Label高度
  3. Linux 动态链接库
  4. = splice
  5. .net Ajax与后台一般处理程序(ashx) 交互
  6. Modular javascript(javascript模块化编程)
  7. 《RabbitMQ Tutorial》第 1 章 简介
  8. 网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器
  9. ListView嵌套GridView
  10. 说一说MVC的过滤器(一)
  11. 傅里叶变换及其应用讲义(stanford_ee261)
  12. docker容器composer 部署 laravel框架
  13. Git 将代码回到指定版本
  14. git 查看/修改用户名、密码
  15. mysql-5.7免安装版本设置
  16. 对threading模块源码文件的解读(不全)
  17. HttpServletResponse status对应的状态信息
  18. 在IIS上运行node
  19. 理解Javascript__理解undefined和null
  20. 11个你应该知道的django博客引擎

热门文章

  1. Mysql 创建表时错误:Tablespace for table `tablexx` exists. Please DISCARD the tablespace before IMPORT.
  2. oauth2-server-php-docs 概念
  3. 在sublime text2上安装xdebug
  4. Oracle导入excel数据快速方法
  5. SpringBoot添加对Mybatis的支持
  6. jQuery 操作 radio、select、checkbox
  7. sql语句查询某一天数据
  8. java 从零开始,学习笔记之基础入门<集合>(十六)
  9. TaskFactory设置并发量
  10. 详解JAVA输出Hello World