Android 根據sql檔案建立資料庫並插入資料

來源:互聯網
上載者:User

Android 根據sql檔案建立資料庫並插入資料

因為在開發用戶端的時候,伺服器端的有寫資料是重複的,不需要再去訪問伺服器的,然後伺服器端提供的是一個sql檔案,裡麵包含了資料庫和資料,我們這些開發用戶端的不可能一行一行的進行手動入庫吧?所以我就想到了直接讀取sql檔案進行建立資料並插入資料好了。

建立DBHelp並繼承SQLiteOpenHelper

public class DBHelper extends SQLiteOpenHelper {private Context mContext;public DBHelper(Context context, String databaseName,CursorFactory factory, int version) {super(context, databaseName, factory, version);mContext = context;}/** * 資料庫第一次建立時調用 * */@Overridepublic void onCreate(SQLiteDatabase db) {if (!tabIsExist("test", db)) {executeAssetsSQL(db, "test.sql");// db.execSQL(sql);//System.out.println("建立表");}}/** * 資料庫升級時調用 * */@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 資料庫不升級if (newVersion <= oldVersion) {return;}Configuration.oldVersion = oldVersion;int changeCnt = newVersion - oldVersion;for (int i = 0; i < changeCnt; i++) {// 依次執行updatei_i+1檔案 由1更新到2 [1-2],2更新到3 [2-3]String schemaName = "update" + (oldVersion + i) + "_"+ (oldVersion + i + 1) + ".sql";executeAssetsSQL(db, schemaName);}}/** * 讀取資料庫檔案(.sql),並執行sql語句 * */private void executeAssetsSQL(SQLiteDatabase db, String schemaName) {BufferedReader in = null;try {in = new BufferedReader(new InputStreamReader(mContext.getAssets().open(Configuration.DB_PATH + "/" + schemaName)));//System.out.println("路徑:" + Configuration.DB_PATH + "/" + schemaName);String line;String buffer = "";while ((line = in.readLine()) != null) {buffer += line;if (line.trim().endsWith(";")) {db.execSQL(buffer.replace(";", ""));buffer = "";}}} catch (IOException e) {Log.e("db-error", e.toString());} finally {try {if (in != null)in.close();} catch (IOException e) {Log.e("db-error", e.toString());}}}public List selectAllCities(SQLiteDatabase db) {List areas = new ArrayList();Area area;String sql = "select * from test where area_level=?";Cursor cursor = db.rawQuery(sql, new String[] { "" + 0 });while(cursor.moveToNext()){area = new Area();area.setId(cursor.getInt(0));area.setArea_name(cursor.getString(2));areas.add(area);area = null;}cursor.close();return areas;}public List selectAllAreas(SQLiteDatabase db,int parent_id) {List areas = new ArrayList();Area area;String sql = "select * from test where parent_id=?";Cursor cursor = db.rawQuery(sql, new String[] { "" + parent_id });while(cursor.moveToNext()){area = new Area();area.setId(cursor.getInt(0));area.setArea_name(cursor.getString(2));areas.add(area);area = null;}cursor.close();return areas;}/** * 判斷是否存在某一張表 * @param tabName * @param db * @return */public boolean tabIsExist(String tabName, SQLiteDatabase db) {boolean result = false;if (tabName == null) {return false;}Cursor cursor = null;try {String sql = "select count(*) as c from sqlite_master where type ='table' and name ='" + tabName.trim() + "' ";cursor = db.rawQuery(sql, null);if (cursor.moveToNext()) {int count = cursor.getInt(0);if (count > 0) {result = true;}}} catch (Exception e) {}return result;}}

Configuration.java是一些常量

public class Configuration {public static final String DB_PATH = "schema";public static final String DB_NAME = "test.db";public static final int DB_VERSION = 1;public static int oldVersion = -1;}
sql檔案是放在assets->schema->test.sql

其實這個過程非常的簡單易懂,就是根據路徑去讀取檔案,然後讀取檔案裡面的內容,再根據關鍵字,sqllite會自動進行相應的操作,所以這個sql檔案中的sql語句一定要規範,不然會寫入不了的。

在activity中調用:

dbHelper = new DBHelper(this, "test", null, 1);dbHelper.onCreate(dbHelper.getWritableDatabase());




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.