我已经创建了一个 SQLite 数据库。我想在我的 Android 项目中使用这个数据库文件。我想将此数据库与我的应用程序捆绑在一起。
应用程序如何访问该数据库并将其用作其数据库,而不是创建一个新数据库?
注意: 在尝试此代码之前,请在以下代码中找到此行:
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(Jelly 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 版本