如何隨apk一起打包并使用SQLite

di183117 7年前發布 | 13K 次閱讀 SQLite Android開發 移動開發

背景

  • 開發環境

    • macOS:Sierra 10.12.1
    • SQLite:3.9.2
    • JDK:1.8.0_77
    • shell:zsh
    </li>
  • 對應源碼:

    shakeba: https://github.com/bihe0832/Shakeba

  • SQLite SQL語法

    https://www.tutorialspoint.com/sqlite/sqlite_data_types.htm

  • </ul>

    準備數據庫

    創建數據表

    • 創建DB文件

      在shell中輸入下面的命令創建db.

      ?  1  sqlite3 shakeba.db
        SQLite version 3.9.2 2015-11-02 18:31:45
        Enter ".help" for usage hints.
    • 查看DB信息

      繼續輸入下面的命令,即可看到創建的db將會保存的位置,另外可以發現sqlite會默認創建名為main的數據庫。

      sqlite> .databases
        seq  name             file


      0 main /Volumes/Document/Document/temp/1/shakeba.db</code></pre> </li>

    • 關聯DB

      開發中可能并不想直接用默認的數據庫名,可以通過ATTACH關聯自定義的名稱。例如

      sqlite> ATTACH DATABASE 'shakeba.db' as shakeba;
        sqlite> .databases
        seq  name             file


      0 main /Volumes/Document/Document/temp/1/shakeba.db 2 shakeba /Volumes/Document/Document/temp/1/shakeba.db 這樣就可以按照自定義的數據庫名來操作了。</code></pre> </li> </ul>

      添加數據

      • 添加默認表

        為了防止android程序出錯,需要在shakeba.db中創建表android_metadata,并插入一行數據具體命令如下:

        sqlite> CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'zh_CN');
          sqlite> INSERT INTO "android_metadata" VALUES ('zh_CN');

        通過查看表確實已經創建好,而且內容OK

        sqlite> .tables
          android_metadata
          sqlite> .header on
          sqlite> select * from android_metadata;
          locale
          zh_CN
      • 添加個人表

        這部分內容主要是添加應用相關的數據表,簡單舉例:

        DROP TABLE IF EXISTS "t_adventure";
          CREATE TABLE "t_adventure" (
              "id" INT PRIMARY KEY NOT NULL,
              "item_type" SMALLINT NOT NULL DEFAULT 1,
              "item_category" SMALLINT NOT NULL DEFAULT 1,
              "content" NVARCHAR(4096) NOT NULL DEFAULT ""
          );

        添加數據

        INSERT INTO "t_adventure" VALUES 
          (1,2,'1','背一位異性繞場一周'),
          (3,2,'1','做一個大家都滿意的鬼臉'),
          (4,2,'2','抱一位異性直到下一輪真心話大冒險結束');

      至此就已經完成了前期的數據庫文件的準備。

      定義版本號

      為了保證二進制的數據文件與代碼使用的一致,可以在二進制的數據文件中定義數據庫的版本號,在應用初始化的時候對比版本號是否一致,如果一致再拷貝使用。

      PRAGMA shakeba.user_version = 1;

      集成數據庫到APK

      將前面創建好的數據庫放在項目工程下源碼的/res/raw路徑下。至此我們就完成了前期的db的準備并添加到項目中,接下來就是數據處理相關的內容。

      數據操作

      拷貝DB

      因為raw中的db無法直接訪問,因此我們在應用初始化的時候要先把db拷貝到應用的私有目錄 getApplicationContext().getDatabasePath( DATABASE_NAME )中。

      • 具體代碼

        InputStream myInput = Shakeba.getInstance().getApplicationContext().getResources().openRawResource(getRawDatabaseResID());

        File file = Shakeba.getInstance().getApplicationContext().getDatabasePath(getDatabaseName());

        if (!file.exists()) { try { OutputStream myOutput = new FileOutputStream(file);

              byte[] buffer = new byte[1024];
              int length;
              while ((length = myInput.read(buffer))>0){
                  myOutput.write(buffer, 0, length);
              }
              myOutput.close();
              myInput.close();
              mIsDBOK = true;
          } catch (Exception e) {
              e.printStackTrace();
          }
        

        }</code></pre> </li>

      • 代碼位置

        在shakeba項目中,這部分邏輯在com.bihe0832.shakeba.framework.database.BaseRawDatabaseHelper中實現

      • </ul>

        增刪改查

        在上面的拷貝DB的動作完成以后,原本打包在APK中的db就已經拷貝到了應用私有目錄下,此時對于數據庫的增刪改查的操作就和正常的使用SQLiteOpenHelper的操作一致了,因此不再特別說明。這部分內容可以參考shakeba項目的以下代碼:

        • com.bihe0832.shakeba.framework.database.*
        • com.bihe0832.shakeba.module.game.adventure.AdventureTableModel

         

        來自:http://blog.bihe0832.com/sqlite-raw-db.html

         

 本文由用戶 di183117 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!