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

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


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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值