如何访问和查询被复制到文件夹资产数据库? [英] How to access and query the database that is copied to the assets folder?

查看:134
本文介绍了如何访问和查询被复制到文件夹资产数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看过一些教程,其中以pre-现有的数据库复制到资产的文件夹,并写入$ C $下对应用程序数据库的默认系统路径复制这个数据库。

I have read few tutorials where in a pre-existing database is copied to assets folder and write code for copying this database on to the default system path of the application database.

package com.example.c1;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.Cursor;
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.example.c/databases/";

        private static String DB_NAME = "MyDatabase";

        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.

}

我用这个code复制数据库从Assets文件夹默认路径。

I use this code for copying the database from assets folder to default path.

package com.example.c1;

import java.io.IOException;
import com.example.c1.DataBaseHelper;
import android.os.Bundle;
import android.app.Activity;
import android.database.SQLException;
import android.view.Menu;
import android.widget.TextView;

public class C1 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.c1);

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

         }


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.c1, menu);
        return true;
    }

}

运行这个,模拟器说,C1已经停止。我点击DDMS视图和文件浏览器选择我的包。我找到了数据库文件夹中。我的资产文件夹,即数据库; MyDatabase的在这里找到。但是,当我拉的文件,并在源码浏览器中打开它只能说明android_metadata表,但不显示在我的数据库其他表。我也不能执行任何查询。如何访问和查询数据库?像DataBaseHelper类执行选择的声明,并呈现出它的结果。我希望我清楚我的问题。我复制到资产的文件夹和code这个数据库复制到默认路径的数据库。是code正确吗?如果没有,那么什么是修正我应该做?我需要执行查询作如何做到这一点?

Running this, the emulator says c1 has stopped. I click on the DDMS view and in file explorer I choose my package. I found "databases" folder. My database in the assets folder ie; "MyDatabase" is found here. But when I pull the file and open it in sqlite browser it only shows the android_metadata table but doesn't show other tables in my database. I am also not able to execute any query. How can I access and query the database? like executing a "Select" statement in DataBaseHelper class and showing the result of it. I hope am clear with my problem. I have a database copied on to assets folder and a code to copy this database to the default path. Is the code correct? If not then what is the correction I should make? I need to execute query n how to do it??

推荐答案

您需要将数据库文件复制到应用程序目录的文件夹,然后使用这个文件来打开数据库

You need to copy your database file to application directory folder then use this file to open database

我用这个来copyDatabase

I use this to copyDatabase

private void copyDataBase()
{
    Log.i("Database", "New database is being copied to device!");
    byte[] buffer = new byte[1024];
    OutputStream myOutput = null;
    int length;
    // Open your local db as the input stream
    InputStream myInput = null;
    try
    {
        myInput = myContext.getAssets().open(DB_NAME);
        // transfer bytes from the inputfile to the
        // outputfile
        myOutput = new FileOutputStream(DB_PATH + DB_NAME);
        while((length = myInput.read(buffer)) > 0)
        {
            myOutput.write(buffer, 0, length);
        }
        myOutput.close();
        myOutput.flush();
        myInput.close();
        Log.i("Database", "New database has been copied to device!");
        cmn.mailDetails();

    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}

打开使用此

protected Boolean openDatabase()
{
    if(isDatabaseExist(false))
    {
        // Open the database
        String myPath = DB_PATH + DB_NAME;
        try
        {
            Log.i("Database", "Trying to Open Database!");
            if(myDataBase != null)
            {
                if(!myDataBase.isOpen())
                {
                    Log.i("Database", "Database is closed now opening it!");
                    myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

                }
                else
                {
                    Log.i("Database", "Database is already Open!");
                }
                Log.i("Database", "Database is Opened successfully in OPEN_READWRITE  Mode !");
                return true;

            }
            else
            {
                myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
                Log.i("Database", "Database is Opened successfully in OPEN_READWRITE  Mode !");
                return true;
            }

        }
        catch(Exception e)
        {
            Log.e("Database", "Some error occured while opening Database Error:" + e.getMessage());
            myDataBase = null;
            return false;
        }

    }
    else
    {
        copyDataBase();
    }
    return false;
}

这篇关于如何访问和查询被复制到文件夹资产数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆