raw下放了一个准备好的数据库,随程序一起打包进apk在这种模式下,开发的时候该怎样操作数据库

解决方案 »

  1.   

    程序头一次启动时将数据库文件从apk中拷贝到sdcard上。以后每次启动在从sdcard读取数据库文件。
      

  2.   

    第一次运行时拷贝到databases/目录下  
    http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
      

  3.   

     把数据库文件放在"assets" folder还是res/raw folder 
      

  4.   

    我照着这个链接做了下,main.xml只有一个按钮,点击该按钮会把apk中的数据库copy到指定的地方
    但是会出错package com.easymorse;import java.io.File; 
    import java.io.FileOutputStream; 
    import java.io.IOException;
    import java.io.InputStream;import android.app.Activity; 
    import android.app.AlertDialog; 
    import android.content.Context;
    import android.database.Cursor; 
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase; 
    import android.os.Bundle; 
    import android.text.Editable; 
    import android.text.TextWatcher; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button;
    import android.widget.TextView;public class SHARKActivity extends Activity  implements OnClickListener{ 
        
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main); 
            View newButton=this.findViewById(R.id.button1);
        newButton.setOnClickListener(SHARKActivity.this);
        } 
        public void onClick(View view) 
        { 
          DataBaseHelper myDbHelper = new DataBaseHelper(null);
             myDbHelper = new DataBaseHelper(this);
             try {
              myDbHelper.createDataBase();
             
       } catch (IOException ioe) {
       throw new Error("Unable to create database");
       }
       try {
       myDbHelper.openDataBase();
       }catch(SQLException sqle){
       throw sqle;
      
       }
      
        }
    }
    //////////////////DataBaseHelper///////////////////
    package com.easymorse;import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;import android.content.Context;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    import android.database.sqlite.SQLiteOpenHelper; public class DataBaseHelper extends SQLiteOpenHelper{
     
        //The Android's default system path of your application database.
        private static String DB_PATH = "/data/data/com.IBO/databases/";
     
        private static String DB_NAME = "f_dic2.db";
     
        private SQLiteDatabase myDataBase; 
     
        private final Context myContext;
     
        /**
         * Constructor
         * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
         * @param context
         */
        public DataBaseHelper(Context context) {
     
         super(context, DB_NAME, null, 1);
            this.myContext = context;
        }
     
      /**
         * Creates a empty database on the system and rewrites it with your own database.
         * */
        public void createDataBase() throws IOException{
     
         boolean dbExist = checkDataBase();
     
         if(dbExist){
         //do nothing - database already exist
         }else{
     
         //By calling this method and empty database will be created into the default system path
                   //of your application so we are gonna be able to overwrite that database with our database.
             this.getReadableDatabase();
     
             try {
     
         copyDataBase();
     
         } catch (IOException e) {
     
             throw new Error("Error copying database");
     
             }
         }
     
        }
     
        /**
         * Check if the database already exist to avoid re-copying the file each time you open the application.
         * @return true if it exists, false if it doesn't
         */
        private boolean checkDataBase(){
     
         SQLiteDatabase checkDB = null;
     
         try{
         String myPath = DB_PATH + DB_NAME;
         checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
     
         }catch(SQLiteException e){
     
         //database does't exist yet.
     
         }
     
         if(checkDB != null){
     
         checkDB.close();
     
         }
     
         return checkDB != null ? true : false;
        }
     
        /**
         * Copies your database from your local assets-folder to the just created empty database in the
         * system folder, from where it can be accessed and handled.
         * This is done by transfering bytestream.
         * */
        private void copyDataBase() throws IOException{
     
         //Open your local db as the input stream
         InputStream myInput = myContext.getAssets().open(DB_NAME);
     
         // Path to the just created empty db
         String outFileName = DB_PATH + DB_NAME;
     
         //Open the empty db as the output stream
         OutputStream myOutput = new FileOutputStream(outFileName);
     
         //transfer bytes from the inputfile to the outputfile
         byte[] buffer = new byte[1024];
         int length;
         while ((length = myInput.read(buffer))>0){
         myOutput.write(buffer, 0, length);
         }
     
         //Close the streams
         myOutput.flush();
         myOutput.close();
         myInput.close();
     
        }
     
        public void openDataBase() throws SQLException{
     
         //Open the database
            String myPath = DB_PATH + DB_NAME;
         myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
     
        }
     
        @Override
    public synchronized void close() {
     
             if(myDataBase != null)
             myDataBase.close();
     
             super.close();
     
    }
     
    @Override
    public void onCreate(SQLiteDatabase db) {
     
    }
     
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
     
    }
     
            // Add your public helper methods to access and get content from the database.
           // You could return cursors by doing "return myDataBase.query(....)" so it'd be easy
           // to you to create adapters for your views.
     
    }main.xml<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
        />
    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    </LinearLayout>
      

  5.   

    报的什么错 这个例子打包的文件要放在assets文件夹下的
      

  6.   

    07-28 16:56:40.905: ERROR/AndroidRuntime(8558): java.lang.Error: Error copying database07-28 16:56:40.905: ERROR/AndroidRuntime(8558):at com.easymorse.DataBaseHelper.createDataBase(DataBaseHelper.java:57)07-28 16:56:40.905: ERROR/AndroidRuntime(8558):     at com.easymorse.SHARKActivity.onClick(SHARKActivity.java:37)
    ============================================================
    关键的三个提示
      

  7.   

    你还要改下路径和名字
    private static String DB_PATH = "/data/data/com.easymorse/databases/";
    private static String DB_NAME = "f_dic2.db";//改成你的数据库文件
      

  8.   

    com.easymorse是我这个程序的包名
    f_dic2.db是我数据库文件的名字
      

  9.   

     private static String DB_PATH = "/data/data/com.IBO/databases/";
    这个路径是我这个模拟器里已经存在的,这样不可以吗?
      

  10.   

    不可以的,你的包名是com.easymorse,你写不了数据到别的应用的文件夹下的权限不够。
      

  11.   

    保存过去了,这样保存到SD卡上了吗?我在mnt/sdcard/文件下什么也没有啊
      

  12.   

    去 DB_PATH 设置的路径找啊
      

  13.   


    String sql = "select * from Question_DATA where id=1";    
    Cursor cursor =dicData.rawQuery(sql, null);
    cursor.moveToFirst();
    String result = cursor.getString(cursor.getColumnIndex("Question_Content"));
    TextView tv=(TextView)SHARKActivity.this.findViewById(R.id.textView1);
    tv.setText(result);CREATE TABLE [Question_DATA] (
      [id] INTEGER, 
      [Question_Content] CHAR NOT NULL, 
      [Answer_A] CHAR NOT NULL, 
      [Answer_B] CHAR NOT NULL, 
      [Answer_C] CHAR, 
      [Answer_D] CHAR, 
      [ANSWER] CHAR NOT NULL, 
      [Undif_field1] CHAR, 
      [Undif_field2] CHAR) 
    --------------------------------------------<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:weightSum="1">
    <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
    <TextView android:layout_height="wrap_content" android:id="@+id/textView1" android:text="TextView" android:layout_width="match_parent" android:layout_weight="0.11"></TextView>
    </LinearLayout>就是实现一点按钮,从Question_DATA表取出id=1的记录,并将该记录的“Question_Content”的字段的内容在TextView上显示出来
    但是报错:
    07-29 10:41:24.691: ERROR/AndroidRuntime(4795):
     android.database.sqlite.SQLiteException: no such table: Question_DATA: , while compiling: select * from Question_DATA where id=1不知是何原因
      

  14.   

    sqlite> .tables 
    查看下有Question_DATA这个表吗
      

  15.   

    我用的是SQLite expert可视化工具
    弄好数据库之后拷贝到
    assets文件下
    ---------------------
    没用过你的方法,让俺研究下
      

  16.   

    数据库后缀,我应该用啥db、db3、db2
    Android版本是2.2
    SQLite Expert 3.33
      

  17.   

    我用.tables看了没有这个数据表
    又用.databases也没有我要的数据库
    我的模式是apk自带数据库,应该不会放到Android自己的SQLite上吧
      

  18.   

    整包代码...请参考

    http://www.box.net/shared/u3oictqj599kfbfepm5j
    数据库名称dbtest
    从 assets 目录移至 /data/data/com.tst.copysql/dbtest