点滴:Android SQLite

public class MyDBHelper extends SQLiteOpenHelper {

	public MyDBHelper(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

	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub

	}

}

SQLiteOpenHelper类,在该类的 构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象。继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个 方法。
onCreate(SQLiteDatabase db) : 当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。
除了上述两个必须要实现的方法外,还可以选择性地实现onOpen 方法,该方法会在每次打开数据库时被调用。


String NAME_DB = "db_test";
String NAME_TABLE = "table_test";

1,数据库的打开

SQLiteOpenHelper helper = new MyDBHelper(this, NAME_DB, null, DB_VERSION);
SQLiteDatabase db = helper.getWritableDatabase();


2,删除表

db.execSQL("DROP TABLE IF EXISTS "+NAME_TABLE);


3,建表

db.execSQL("CREATE TABLE "+NAME_TABLE +" (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT, coin INTEGER)");


4,增

db.execSQL("INSERT INTO "+NAME_TABLE+" VALUES (NULL, ?, ?, ?)", new Object[]{"zhangsan", 20, 1000});

或者

ContentValues cv = new ContentValues();
cv.put("name", "lisi");
cv.put("age", 30);
cv.put("coin", 2000);
db.insert(NAME_TABLE, null, cv);


5,删

db.delete(NAME_TABLE, "age < ?", new String[]{"25"});


6,改

cv = new ContentValues();
cv.put("name", "zhangsan1");
db.update(NAME_TABLE, cv, "name = ?", new String[]{"zhangsan"});


7,查

cursor = db.rawQuery("SELECT * FROM "+NAME_TABLE+" WHERE age >= ?", new String[]{"1"});
while(cursor.moveToNext()){
      int id = cursor.getInt(cursor.getColumnIndex("_id"));
      String name = cursor.getString(cursor.getColumnIndex("name"));
      int age = cursor.getInt(cursor.getColumnIndex("age"));
      int coin = cursor.getInt(cursor.getColumnIndex("coin"));
}


8,增加表字段

db.execSQL("ALTER TABLE "+NAME_TABLE+" ADD weight INTEGER");


9,修改表字段名或者删除字段
只能先重命名原来的表,之后新建一张表,把原来的数据复制到新表中,最后删除掉旧的表就可以了。

String TABLE_TEMP = "temp";
			String rename_sql = "ALTER TABLE " + NAME_TABLE + " RENAME TO " + TABLE_TEMP;

			String createnew_sql = "CREATE TABLE " + NAME_TABLE + " AS SELECT _id, name, age, weight FROM "
					+ TABLE_TEMP;

			String drop_sql = "DROP TABLE " + TABLE_TEMP;

			db.execSQL(rename_sql);

			db.execSQL(createnew_sql);

			db.execSQL(drop_sql);



Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。(getReadableDatabase()方法中会调用getWritableDatabase()方法)

其中getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。

getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。

源码如下:

[java]  view plain copy
  1. /** 
  2.      * Create and/or open a database that will be used for reading and writing. 
  3.      * Once opened successfully, the database is cached, so you can call this 
  4.      * method every time you need to write to the database.  Make sure to call 
  5.      * {@link #close} when you no longer need it. 
  6.      * 
  7.      * <p>Errors such as bad permissions or a full disk may cause this operation 
  8.      * to fail, but future attempts may succeed if the problem is fixed.</p> 
  9.      * 
  10.      * @throws SQLiteException if the database cannot be opened for writing 
  11.      * @return a read/write database object valid until {@link #close} is called 
  12.      */  
  13.     public synchronized SQLiteDatabase getWritableDatabase() {  
  14.         if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) {  
  15.             return mDatabase;  // The database is already open for business  
  16.         }  
  17.   
  18.         if (mIsInitializing) {  
  19.             throw new IllegalStateException("getWritableDatabase called recursively");  
  20.         }  
  21.   
  22.         // If we have a read-only database open, someone could be using it  
  23.         // (though they shouldn't), which would cause a lock to be held on  
  24.         // the file, and our attempts to open the database read-write would  
  25.         // fail waiting for the file lock.  To prevent that, we acquire the  
  26.         // lock on the read-only database, which shuts out other users.  
  27.   
  28.         boolean success = false;  
  29.         SQLiteDatabase db = null;  
  30.         if (mDatabase != null) mDatabase.lock();  
  31.         try {  
  32.             mIsInitializing = true;  
  33.             if (mName == null) {  
  34.                 db = SQLiteDatabase.create(null);  
  35.             } else {  
  36.                 db = mContext.openOrCreateDatabase(mName, 0, mFactory);  
  37.             }  
  38.   
  39.             int version = db.getVersion();  
  40.             if (version != mNewVersion) {  
  41.                 db.beginTransaction();  
  42.                 try {  
  43.                     if (version == 0) {  
  44.                         onCreate(db);  
  45.                     } else {  
  46.                         onUpgrade(db, version, mNewVersion);  
  47.                     }  
  48.                     db.setVersion(mNewVersion);  
  49.                     db.setTransactionSuccessful();  
  50.                 } finally {  
  51.                     db.endTransaction();  
  52.                 }  
  53.             }  
  54.   
  55.             onOpen(db);  
  56.             success = true;  
  57.             return db;  
  58.         } finally {  
  59.             mIsInitializing = false;  
  60.             if (success) {  
  61.                 if (mDatabase != null) {  
  62.                     try { mDatabase.close(); } catch (Exception e) { }  
  63.                     mDatabase.unlock();  
  64.                 }  
  65.                 mDatabase = db;  
  66.             } else {  
  67.                 if (mDatabase != null) mDatabase.unlock();  
  68.                 if (db != null) db.close();  
  69.             }  
  70.         }  
  71.     }  
  72.   
  73.     /** 
  74.      * Create and/or open a database.  This will be the same object returned by 
  75.      * {@link #getWritableDatabase} unless some problem, such as a full disk, 
  76.      * requires the database to be opened read-only.  In that case, a read-only 
  77.      * database object will be returned.  If the problem is fixed, a future call 
  78.      * to {@link #getWritableDatabase} may succeed, in which case the read-only 
  79.      * database object will be closed and the read/write object will be returned 
  80.      * in the future. 
  81.      * 
  82.      * @throws SQLiteException if the database cannot be opened 
  83.      * @return a database object valid until {@link #getWritableDatabase} 
  84.      *     or {@link #close} is called. 
  85.      */  
  86.     public synchronized SQLiteDatabase getReadableDatabase() {  
  87.         if (mDatabase != null && mDatabase.isOpen()) {  
  88.             return mDatabase;  // The database is already open for business  
  89.         }  
  90.   
  91.         if (mIsInitializing) {  
  92.             throw new IllegalStateException("getReadableDatabase called recursively");  
  93.         }  
  94.   
  95.         try {  
  96.             return getWritableDatabase();  
  97.         } catch (SQLiteException e) {  
  98.             if (mName == nullthrow e;  // Can't open a temp database read-only!  
  99.             Log.e(TAG, "Couldn't open " + mName + " for writing (will try read-only):", e);  
  100.         }  
  101.   
  102.         SQLiteDatabase db = null;  
  103.         try {  
  104.             mIsInitializing = true;  
  105.             String path = mContext.getDatabasePath(mName).getPath();  
  106.             db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY);  
  107.             if (db.getVersion() != mNewVersion) {  
  108.                 throw new SQLiteException("Can't upgrade read-only database from version " +  
  109.                         db.getVersion() + " to " + mNewVersion + ": " + path);  
  110.             }  
  111.   
  112.             onOpen(db);  
  113.             Log.w(TAG, "Opened " + mName + " in read-only mode");  
  114.             mDatabase = db;  
  115.             return mDatabase;  
  116.         } finally {  
  117.             mIsInitializing = false;  
  118.             if (db != null && db != mDatabase) db.close();  
  119.         }  
  120.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值