SQLiteOpenHelper 使用方法

public abstract class SQLiteOpenHelper extends Object


Class Overview
A helper class to manage database creation and version management.
You create a subclass implementing onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and optionally onOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.
This class makes it easy for ContentProvider implementations to defer opening and upgrading the database until first use, to avoid blocking application startup with long-running database upgrades.
For an example, see the NotePadProvider class in the NotePad sample application, in the samples/ directory of the SDK.

Note: this class assumes monotonically increasing version numbers for upgrades.


getReadableDatabase()
getWritableDatabase()
onCreate(SQLiteDatabase db)
onOpen(SQLiteDatabase db)
onUpgrade(SQLiteDatabase db , int oldVersion, int newVersion)
close()


主要函数有:


SQLiteDatabase getReadableDatabase()
Create and/or open a database.


SQLiteDatabase getWritableDatabase()
Create and/or open a database that will be used for reading and writing.


这两个函数返回的都是SQLiteDatabase对象
SQLiteDatabase  --- Exposes methods to manage a SQLite database.
SQLiteDatabase 对象用来实际对数据库增删改查


synchronized void close()
Close any open database object.


回调函数

void onConfigure(SQLiteDatabase db)
Called when the database connection is being configured, to enable features such as write-ahead logging or foreign key support.


abstract void onCreate(SQLiteDatabase db)
Called when the database is created for the first time.


void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)
Called when the database needs to be downgraded.


void onOpen(SQLiteDatabase db)
Called when the database has been opened.


abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
Called when the database needs to be upgraded.


void setWriteAheadLoggingEnabled(boolean enabled)
Enables or disables the use of write-ahead logging for the database.


关于version字段 


Note: this class assumes monotonically increasing version numbers for upgrades.


public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion)
Called when the database needs to be upgraded. 

The implementation should use this method to drop tables, add tables, or do anything else it needs to upgrade to the new schema version.


public void onDowngrade (SQLiteDatabase db, int oldVersion, int newVersion)

Called when the database needs to be downgraded. This is strictly similar to onUpgrade(SQLiteDatabase, int, int) method,
but is called whenever current version is newer than requested one. However, this method is not abstract, so it is not mandatory for a customer to implement it. 
If not overridden, default implementation will reject downgrade and throws SQLiteException
This method executes within a transaction. If an exception is thrown, all changes will automatically be rolled back.


version 是单调递增的


当数据库需要更新操作时调用onUpgrade函数, 只要是更改了数据库结构, 比如删除表, 添加表, 或其他任何更新数据库scheme的操作系统会自动调用调用这个函数.   


可以进控制台adb shell ,  进入到程序目录, 用sqlite3 databaseName 来查看数据库, .schema 命令可以查看数据库结构.



onDowngrade当需要数据库降级操作的时候调用这个函数, 比如请求的数据库版本比实际的数据库版本要低的话, 就会调用这个onDowngrade, 如果没有重写这个函数则默认会抛出异常.
Downgrade操作是在数据库处理的过程中调用, 如果发生异常,会自动撤销对数据库的更改


加入这个version可能是想实现rollback的操作??  但是具体没有试验过, 但这两个函数即使都不进行什么操作,并不会有什么问题...


onUpgrade 和 onDowngrade 必须复写不然会抛出异常

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	// TODO Auto-generated method stub
	System.out.println("update a Database");
}
/* (non-Javadoc)
 * @see android.database.sqlite.SQLiteOpenHelper#onDowngrade(android.database.sqlite.SQLiteDatabase, int, int)
 */
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	// TODO Auto-generated method stub
	System.out.println("downGrade a Database");
	//super.onDowngrade(db, oldVersion, newVersion);
}



创建一个DatabaseHelper对象


Android系统会判断如果数据库已经存在则不会创建, 否则会调用 DatabaseHelper extends SQLiteOpenHelper  这个类里面的回调函数onCreate来创建数据库
这样挺方便的, 不需要写代码去判断数据库是否存在,是否需要创建,  只需要直接说需要访问哪个数据库, 第一次访问时,会自动去调用回调函数, 只要在回调函数里写上创建表的操作即可
以后每次访问就可以直接去进行表的操作了.


DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");


//只有调用了DatabaseHelper对象的getReadableDatabase()方法,或者是getWritableDatabase()方法之后,才会创建,或打开一个数据库

SQLiteDatabase db = dbHelper.getReadableDatabase();


	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		System.out.println("create a Database");
		//execSQL函数用于执行SQL语句
		db.execSQL("create table user(id int,name varchar(20))");
	}


Activity 里面 插入, 更新, 查询操作:

<strong>  </strong>  class InsertListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			//生成ContentValues对象
			ContentValues values = new ContentValues();
			//想该对象当中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致
			values.put("id", 1);
			values.put("name","zhangsan");
			DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db",2);
			SQLiteDatabase db = dbHelper.getWritableDatabase();
			//调用insert方法,就可以将数据插入到数据库当中
			db.insert("user", null, values);
		}
    }
    //更新操作就相当于执行SQL语句当中的update语句
    //UPDATE table_name SET XXCOL=XXX WHERE XXCOL=XX...
    class UpdateRecordListener implements OnClickListener{

		@Override
		public void onClick(View arg0) {
			// TODO Auto-generated method stub
			//得到一个可写的SQLiteDatabase对象
			DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");
			SQLiteDatabase db = dbHelper.getWritableDatabase();
			ContentValues values = new ContentValues();
			values.put("name", "zhangsanfeng");
			//第一个参数是要更新的表名
			//第二个参数是一个ContentValeus对象
			//第三个参数是where子句
			db.update("user", values, "id=?", new String[]{"1"});
		}
    }
    class QueryListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			System.out.println("aaa------------------");
			Log.d("myDebug", "myFirstDebugMsg");
			
			DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_mars_db");
			SQLiteDatabase db = dbHelper.getReadableDatabase();
			Cursor cursor = db.query("user", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);
			while(cursor.moveToNext()){
				String name = cursor.getString(cursor.getColumnIndex("name"));
				System.out.println("query--->" + name);
			}
		}
    }



SQLiteOpenHelperAndroid提供的一个帮助类,用于管理SQLite数据库的创建和版本更新。其使用方法如下: 1. 创建一个继承自SQLiteOpenHelper的类。 ```java public class MyDatabaseHelper extends SQLiteOpenHelper { // 构造方法 public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } // 数据库第一次创建时调用 @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table user (_id integer primary key autoincrement, name text, age integer)"); } // 数据库版本更新时调用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exists user"); onCreate(db); } } ``` 2. 在需要使用数据库的地方,创建该类的实例,并调用getReadableDatabase()或getWritableDatabase()方法获取可读写的数据库对象。 ```java MyDatabaseHelper dbHelper = new MyDatabaseHelper(context, "mydb", null, 1); SQLiteDatabase db = dbHelper.getReadableDatabase(); ``` 3. 使用SQLiteDatabase对象进行数据库操作。 ```java // 插入数据 ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 20); db.insert("user", null, values); // 查询数据 Cursor cursor = db.query("user", null, null, null, null, null, null); if (cursor.moveToFirst()) { do { String name = cursor.getString(cursor.getColumnIndex("name")); int age = cursor.getInt(cursor.getColumnIndex("age")); } while (cursor.moveToNext()); } cursor.close(); // 更新数据 ContentValues values = new ContentValues(); values.put("age", 21); db.update("user", values, "name=?", new String[]{"张三"}); // 删除数据 db.delete("user", "name=?", new String[]{"张三"}); ``` 4. 关闭数据库。 ```java db.close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值