关于SQLite数据库随APK一起发布

来源:互联网 发布:python 函数参数传递 编辑:程序博客网 时间:2024/05/18 03:54

文章部分内容取自网络,特此说明!


SQLite数据库随APK一起发布的基本步骤总结:

  1. 使用SQLite工具创建数据库及其表,除了软件本身要用到的表之外,要多加一个android_metadata表,否则会报错,原因可能在于android系统会通过这个表确定locale方面的信息。
    CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'zh_CN')INSERT INTO "android_metadata" VALUES ('zh_CN')
  2. 在raw或asset文件夹中加入建好的数据库;放在这两个文件夹是因为它们在编译时不会被改变,可以直接使用IO进行复制,以备后用。
  3. 在某个activity或service中完成数据库复制的操作;一般情况下在欢迎界面完成;代码如下:
    import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream; import com.android.qufu.dinner.MealActivityGroup;import com.android.qufu.dinner.R; import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.content.pm.ActivityInfo;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteException;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Window;import android.view.WindowManager;import android.widget.ImageView;import android.widget.TextView; public class Loggin extends Activity {    public static String dbName="dinner.db";//数据库的名字    private static String DATABASE_PATH="/data/data/com.android.qufu.dinner/databases/";//数据库在手机里的路径                  public void onCreate(Bundle savedInstanceState) {             super.onCreate(savedInstanceState);             setContentView(R.layout.login);             //判断数据库是否存在            boolean dbExist = checkDataBase();            if(dbExist){                             }else{//不存在就把raw里的数据库写入手机                try{                    copyDataBase();                }catch(IOException e){                    throw new Error("Error copying database");                }            }                         new Thread(new Runnable() {                 public void run() {                                                             while (b < 2) {                         try {                             if (b == 0) {                                 Thread.sleep(20);                                 b = 1;                             } else {                                 Thread.sleep(50);                             }                             updateApp();                         } catch (InterruptedException e) {                             e.printStackTrace();                         }                     }                 }             }).start();                      }                 /**         * 判断数据库是否存在         * @return false or true         */        public boolean checkDataBase(){            SQLiteDatabase checkDB = null;            try{                String databaseFilename = DATABASE_PATH+dbName;                checkDB =SQLiteDatabase.openDatabase(databaseFilename, null,                        SQLiteDatabase.OPEN_READONLY);            }catch(SQLiteException e){                             }            if(checkDB!=null){                checkDB.close();            }            return checkDB !=null?true:false;        }  
            * 复制数据库到手机指定文件夹下
             * @throws IOException         */        public void copyDataBase() throws IOException{            String databaseFilenames =DATABASE_PATH+dbName;            File dir = new File(DATABASE_PATH);            if(!dir.exists())//判断文件夹是否存在,不存在就新建一个                dir.mkdir();            FileOutputStream os = null;            try{                os = new FileOutputStream(databaseFilenames);//得到数据库文件的写入流            }catch(FileNotFoundException e){                e.printStackTrace();            }            InputStream is = this.getResources().openRawResource(R.raw.test);//得到数据库文件的数据流,其中test是数据库的名字            byte[] buffer = new byte[8192];            int count = 0;            try{                                 while((count=is.read(buffer))>0){                    os.write(buffer, 0, count);                    os.flush();                }            }catch(IOException e){                             }            try{                is.close();                os.close();            }catch(IOException e){                e.printStackTrace();            }        }    } 
  4. 完成复制之后,使用SQLiteDatabase类的静态方法openDatabase(参数)或者openOrCreateDatabase(参数)等方法获得一个SQLiteDatabase的实例,然后用此实例进行数据库的操作
    this.db = SQLiteDatabase.openDatabase("/data/data/com.hz.speakpractice/databases/speakpractice.db",null, SQLiteDatabase.OPEN_READONLY);