本文使用的編碼環境是eclipse Indigo + sqlite3 + SDK2.3.3
1,簡介
android使用的是sqlite數據庫,在官方主頁http://sqlite.org/上可以下載到。為了方便管理sqlite,可以下載一個sqlite的可視化軟件,本人使用的是sqlite expert presonal,免費版。
2,建立數據庫
使用sqlite新建數據庫的方式如下:
1,將sqlite.exe放到某個路徑下,比如D:/database
2,在cmd下進入到D:/database下(cd D:/database)
3,在cmd中繼續輸入sqlite3.exe test.db,執行完后cmd會進入SQLITE>狀態下,此時test.db已經新建完畢。在D:/database下已經有了一個test.db的數據庫文件。
4,接下來就可以直接在cmd中繼續輸入各種語句對數據庫進行操作,也可以使用sqlite的可視化軟件對test.db進行各種操作。
5,為了防止android程序出錯,需要在test.db中新建一個名叫android_metadata的表。鍵入以下sql語句
CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'zh_CN')
3,讀取數據庫+數據庫版本更新
注意:
a, 將隨apk發布的數據庫放在android工程下/res/raw路徑下。
b, 數據庫文件存到手機上時,路徑在/data/data/你的包名/databases下,其他路徑則會出錯。
需要直接在工程里新建數據庫時,會繼承SQLiteOpenHelper,但本文講的是隨apk一起發布數據庫的情況,因此沒有必要繼承SQLiteOpenHelper,但也需要對test.db做一層包裝,在對test.db進行包裝的類對數據庫進行操作。
編寫程序的過程中經常改變數據庫的結構,此時可以通過數據庫版本號來判斷是否應該更新手機上的數據庫,sqlite中數據庫的user_version提供了這個幫助。下面的命令可以更改數據庫的user_version,user_version必須是整數型的。
PRAGMA [database.]user_version = 2 ;
下面是實現代碼,包括將數據庫寫到手機上以及對數據庫進行更新。
public class TestSqlDatabase{ private static final String DATABASE_PATH = "/data/data/your.package.name/databases"; private static final int DATABASE_VERSION = 0; private static final String DATABASE_NAME = "test.db"; private static String outFileName = DATABASE_PATH + "/" + DATABASE_NAME; private Context context;
private SQLiteDatabase database; public TestSqlDatabase(Context context) { this.context = context; File file = new File(outFileName); if (file.exists()) { database = SQLiteDatabase.openOrCreateDatabase(outFileName, null); if (database.getVersion() != DATABASE_VERSION) { database.close(); file.delete(); } } try { buildDatabase(); } catch (Exception e) { e.printStackTrace(); } } private void buildDatabase() throws Exception{ InputStream myInput = context.getResources().openRawResource(R.raw.test); File file = new File(outFileName); File dir = new File(DATABASE_PATH); if (!dir.exists()) { if (!dir.mkdir()) { throw new Exception("創建失敗"); } } if (!file.exists()) { try { OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer))>0){ myOutput.write(buffer, 0, length); } myOutput.close(); myInput.close(); } catch (Exception e) { e.printStackTrace(); } } } }
4,增刪改查
查找:
/** * 查找 * @return */ public Cursor select() { database = SQLiteDatabase.openOrCreateDatabase(outFileName, null); String sql = "select * from note_table"; Cursor cursor = database.rawQuery(sql, null); return cursor; }
插入:
/** * 插入 * @param word * @param note * @return */ public long insert(String word, String note) { database = SQLiteDatabase.openOrCreateDatabase(outFileName, null); ContentValues cv = new ContentValues(); cv.put("word", word); cv.put("note", note); long result = database.insert("note_table", null, cv); return result; }
更新:
/** * 更新 * @param word * @param note * @return */ private int update(String word, String note) { database = SQLiteDatabase.openOrCreateDatabase(outFileName, null); ContentValues cv = new ContentValues(); cv.put("note", note); int result = database.update("note_table", cv, "word=?", new String[]{word}); return result; }
刪除:
/** * 刪除 * @param word */ public int deleteNote(String word) { database = SQLiteDatabase.openOrCreateDatabase(outFileName, null); int result = database.delete("note_table", "word=?", new String[]{word}); return result; }
database使用之后需要調用close方法,但是在增刪改查方法中如果關閉database的話,返回的cursor就不能使用了,因此可以寫一個close方法來關閉數據庫,每次操作數據庫后調用此方法,如下所示。
public void close() { database.close(); }