在Android程序中使用已有的SQLite数据库

来源:互联网 发布:linux wget 编辑:程序博客网 时间:2024/05/13 13:44

最近自己写的程序涉及到调用已有数据库,就在网上搜了一下,发现这篇文章很不错,就转载学习一下,原帖地址:http://blog.csdn.net/naturebe/article/details/40718521

在中文搜索中,没有找到一篇比较好的关于如何在Android应用中使用自己事先创建好的数据库的文章,于是在谷歌上找到这篇英文文章,按照它的步骤,测试成功,决定把这篇文章大致的翻译一下,想看原文的可以点击这里:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ ,这篇文章有700多条评论,所以应该还是经历过比较多的讨论的。在overstackflow的一些解答中,也是直接引用了这篇文章。分享给有需要的同学。


译文:

    在大多数的Android示例或是教程中,都是假设你需要在程序运行的时候创建一个数据库并插入新的数据,而不是使用一个独立的提前读取的数据库。

    这里要讲到的是,如何使用你自己的存储在“assets”文件夹下的SQLite数据库,即怎样将你准备好的数据库复制到你Android程序的系统数据库路径下,从而让SQLiteDatabase API能够正常的读取它。

  1. 准备SQLite database文件

    假设你已经创建了一个sqlite数据库,我们需要对其进行一些修改。

   (译者注:这里原文是推荐了一个SQLite数据库管理软件,这个我觉得可以随自己的喜好,最Windows下面有多款可视化的SQlite数据库管理软件,可以方便的读取,编辑数据库,例如我用的是sqlitestudio

打开数据库,添加一个新的table “android_metadata",插入一行数据,具体的SQL如下:

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')  
  2.   
  3. INSERT INTO "android_metadata" VALUES ('en_US')  
   (译者注:上面两行是表明需要进行的操作,具体可以直接在sqlitesstudio中完成)

    然后你需要对你数据表格的primary id 列重命名为 “_id”,这样Adroid会知道怎么对id列进行绑定,你可以很容易的在SQlite数据库管理软件中进行列编辑。

    这两步之后,你的sqlite数据库文件就准备好了。

  (译者注:这里我保留了id列,即没有对其进行重命名,测试证明也是没有问题的)


2. 在你的Android程序中复制,打开以及访问数据库

    现在把你上一步准备好的数据库文件放在“assets”文件夹下面,然后通过继承 SQLiteOpenHelper类来创建一个Database Helper类,

你的DataBaseHelper类大致可以如下:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. public class DataBaseHelper extends SQLiteOpenHelper{  
  2.    
  3.     //The Android's default system path of your application database.  
  4.     private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";  
  5.    
  6.     private static String DB_NAME = "myDBName";  
  7.    
  8.     private SQLiteDatabase myDataBase;   
  9.    
  10.     private final Context myContext;  
  11.    
  12.     /** 
  13.      * Constructor 
  14.      * Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
  15.      * @param context 
  16.      */  
  17.     public DataBaseHelper(Context context) {  
  18.    
  19.         super(context, DB_NAME, null1);  
  20.         this.myContext = context;  
  21.     }     
  22.    
  23.   /** 
  24.      * Creates a empty database on the system and rewrites it with your own database. 
  25.      * */  
  26.     public void createDataBase() throws IOException{  
  27.    
  28.         boolean dbExist = checkDataBase();  
  29.    
  30.         if(dbExist){  
  31.             //do nothing - database already exist  
  32.         }else{  
  33.    
  34.             //By calling this method and empty database will be created into the default system path  
  35.                //of your application so we are gonna be able to overwrite that database with our database.  
  36.             this.getReadableDatabase();  
  37.    
  38.             try {  
  39.    
  40.                 copyDataBase();  
  41.    
  42.             } catch (IOException e) {  
  43.    
  44.                 throw new Error("Error copying database");  
  45.    
  46.             }  
  47.         }  
  48.    
  49.     }  
  50.    
  51.     /** 
  52.      * Check if the database already exist to avoid re-copying the file each time you open the application. 
  53.      * @return true if it exists, false if it doesn't 
  54.      */  
  55.     private boolean checkDataBase(){  
  56.    
  57.         SQLiteDatabase checkDB = null;  
  58.    
  59.         try{  
  60.             String myPath = DB_PATH + DB_NAME;  
  61.             checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);  
  62.    
  63.         }catch(SQLiteException e){  
  64.    
  65.             //database does't exist yet.  
  66.    
  67.         }  
  68.    
  69.         if(checkDB != null){  
  70.    
  71.             checkDB.close();  
  72.    
  73.         }  
  74.    
  75.         return checkDB != null ? true : false;  
  76.     }  
  77.    
  78.     /** 
  79.      * Copies your database from your local assets-folder to the just created empty database in the 
  80.      * system folder, from where it can be accessed and handled. 
  81.      * This is done by transfering bytestream. 
  82.      * */  
  83.     private void copyDataBase() throws IOException{  
  84.    
  85.         //Open your local db as the input stream  
  86.         InputStream myInput = myContext.getAssets().open(DB_NAME);  
  87.    
  88.         // Path to the just created empty db  
  89.         String outFileName = DB_PATH + DB_NAME;  
  90.    
  91.         //Open the empty db as the output stream  
  92.         OutputStream myOutput = new FileOutputStream(outFileName);  
  93.    
  94.         //transfer bytes from the inputfile to the outputfile  
  95.         byte[] buffer = new byte[1024];  
  96.         int length;  
  97.         while ((length = myInput.read(buffer))>0){  
  98.             myOutput.write(buffer, 0, length);  
  99.         }  
  100.    
  101.         //Close the streams  
  102.         myOutput.flush();  
  103.         myOutput.close();  
  104.         myInput.close();  
  105.    
  106.     }  
  107.    
  108.     public void openDataBase() throws SQLException{  
  109.    
  110.         //Open the database  
  111.         String myPath = DB_PATH + DB_NAME;  
  112.         myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);  
  113.    
  114.     }  
  115.    
  116.     @Override  
  117.     public synchronized void close() {  
  118.    
  119.             if(myDataBase != null)  
  120.                 myDataBase.close();  
  121.    
  122.             super.close();  
  123.    
  124.     }  
  125.    
  126.     @Override  
  127.     public void onCreate(SQLiteDatabase db) {  
  128.    
  129.     }  
  130.    
  131.     @Override  
  132.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  133.    
  134.     }  
  135.    
  136.         // Add your public helper methods to access and get content from the database.  
  137.        // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy  
  138.        // to you to create adapters for your views.  
  139.    
  140. }  

    就这样。

    现在你可以创建一个新的DataBaseHelper实例,然后调用createDataBase(),然后再调用openDataBase()方法,记住修改DB_PATH字符串中“YOUR_PACKAGE”为你真正的package名称(也就是说com.examplename.myapp)——(我:myDBName是数据库全称:test.db)

以下是示范代码:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. ...  
  2.   
  3.        DataBaseHelper myDbHelper = new DataBaseHelper();  
  4.        myDbHelper = new DataBaseHelper(this);  
  5.   
  6.        try {  
  7.   
  8.         myDbHelper.createDataBase();  
  9.   
  10.     } catch (IOException ioe) {  
  11.   
  12.         throw new Error("Unable to create database");  
  13.   
  14.     }  
  15.   
  16.     try {  
  17.   
  18.         myDbHelper.openDataBase();  
  19.   
  20.     }catch(SQLException sqle){  
  21.   
  22.         throw sqle;  
  23.   
  24.     }  
  25.   
  26.        ...  

暂时记录到这,是否可以使用xml文件以后思考。


0 0
原创粉丝点击