java - 如何在 Android 应用程序中使用现有数据库

标签 java android eclipse sqlite

<分区>

我已经创建了一个 SQLite 数据库。我想在我的 Android 项目中使用这个数据库文件。我想将该数据库与我的应用程序 bundle 在一起。

应用程序如何获得对该数据库的访问权并将其用作其数据库,而不是创建新数据库?

最佳答案

注意: 在尝试此代码之前,请在下面的代码中找到这一行:

private static String DB_NAME ="YourDbName"; // Database name

这里的DB_NAME 是你的数据库的名字。假设您在 assets 文件夹中有数据库的副本,例如,如果您的数据库名称是 ordersDB,那么 DB_NAME 的值将是 ordersDB,

private static String DB_NAME ="ordersDB";

将数据库保存在assets文件夹中,然后按照以下步骤操作:

数据助手类:

import java.io.File;
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.SQLiteOpenHelper;
import android.util.Log;

public class DataBaseHelper extends SQLiteOpenHelper {

    private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window
    private static String DB_NAME ="YourDbName"; // Database name
    private static int DB_VERSION = 1; // Database version
    private final File DB_FILE;
    private SQLiteDatabase mDataBase;
    private final Context mContext;

    public DataBaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        DB_FILE = context.getDatabasePath(DB_NAME);
        this.mContext = context;
    }

    public void createDataBase() throws IOException {
        // If the database does not exist, copy it from the assets.
        boolean mDataBaseExist = checkDataBase();
        if(!mDataBaseExist) {
            this.getReadableDatabase();
            this.close();
            try {
                // Copy the database from assests
                copyDataBase();
                Log.e(TAG, "createDatabase database created");
            } catch (IOException mIOException) {
                throw new Error("ErrorCopyingDataBase");
            }
        }
    }

    // Check that the database file exists in databases folder
    private boolean checkDataBase() {
        return DB_FILE.exists();
    }

    // Copy the database from assets
    private void copyDataBase() throws IOException {
        InputStream mInput = mContext.getAssets().open(DB_NAME);
        OutputStream mOutput = new FileOutputStream(DB_FILE);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer)) > 0) {
            mOutput.write(mBuffer, 0, mLength);
        }
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }

    // Open the database, so we can query it
    public boolean openDataBase() throws SQLException {
        // Log.v("DB_PATH", DB_FILE.getAbsolutePath());
        mDataBase = SQLiteDatabase.openDatabase(DB_FILE, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        // mDataBase = SQLiteDatabase.openDatabase(DB_FILE, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        return mDataBase != null;
    }

    @Override
    public synchronized void close() {
        if(mDataBase != null) {
            mDataBase.close();
        }
        super.close();
    }

}

像这样编写一个 DataAdapter 类:

import java.io.IOException;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class TestAdapter {

    protected static final String TAG = "DataAdapter";

    private final Context mContext;
    private SQLiteDatabase mDb;
    private DataBaseHelper mDbHelper;

    public TestAdapter(Context context) {
        this.mContext = context;
        mDbHelper = new DataBaseHelper(mContext);
    }

    public TestAdapter createDatabase() throws SQLException {
        try {
            mDbHelper.createDataBase();
        } catch (IOException mIOException) {
            Log.e(TAG, mIOException.toString() + "  UnableToCreateDatabase");
            throw new Error("UnableToCreateDatabase");
        }
        return this;
    }

    public TestAdapter open() throws SQLException {
        try {
            mDbHelper.openDataBase();
            mDbHelper.close();
            mDb = mDbHelper.getReadableDatabase();
        } catch (SQLException mSQLException) {
            Log.e(TAG, "open >>"+ mSQLException.toString());
            throw mSQLException;
        }
        return this;
    }

    public void close() {
        mDbHelper.close();
    }

     public Cursor getTestData() {
         try {
             String sql ="SELECT * FROM myTable";
             Cursor mCur = mDb.rawQuery(sql, null);
             if (mCur != null) {
                mCur.moveToNext();
             }
             return mCur;
         } catch (SQLException mSQLException) {
             Log.e(TAG, "getTestData >>"+ mSQLException.toString());
             throw mSQLException;
         }
     }
}

现在您可以像这样使用它:

TestAdapter mDbHelper = new TestAdapter(urContext);
mDbHelper.createDatabase();
mDbHelper.open();

Cursor testdata = mDbHelper.getTestData();

mDbHelper.close();

编辑:感谢 JDx

对于 Android 4.1 (果冻 bean ),变化:

DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";

到:

DB_PATH = context.getApplicationInfo().dataDir + "/databases/";

在 DataHelper 类中,此代码将适用于 Jelly Bean 4.2 多用户。

编辑:我们可以使用

而不是使用硬编码路径
DB_PATH = context.getDatabasePath(DB_NAME).getAbsolutePath();

这将为我们提供数据库文件的完整路径并适用于所有 Android 版本

关于java - 如何在 Android 应用程序中使用现有数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3016606/

相关文章:

java - 使用Apache DS/Apache Directory Studio的Hadoop安全性

java - 如何加载 Shopizer 的测试数据或示例数据?

java - firebase检索值不正确

android - 如何获取 RecyclerView 项目的 ViewHolder

java - Androistudio 灰色包无法添加到存储库

android - 如何在android中实现监听器

java - Android 中的对齐文本

android - ant可以使用Eclipse创建的build.xml吗?

java - 如何使用远程 Java 编译器?

eclipse - 在 Eclipse 中按包重新组合 Java 类