当前位置: 首页 > 面试题库 >

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

金珂
2023-03-14
问题内容

我已经创建了一个SQLite数据库。我想将此数据库文件用于我的Android项目。我想将此数据库与我的应用程序捆绑在一起。

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


问题答案:

注意: 在尝试此代码之前,请在以下代码中找到此行:

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

DB_NAME此处是你的数据库的名称。假设你在Assets文件夹中有数据库的副本,因此,例如,如果你的数据库名称为ordersDB,则DB_NAME的值为orderDB

private static String DB_NAME ="ordersDB";

将数据库保留在资产文件夹中,然后执行以下操作:

DataHelper类:

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();

对于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版本



 类似资料:
  • 我最近编写了一个Android应用程序。这只是一个简单的应用程序,让你保持几个简单的计数器间隔的篮球比赛得分。我得到了增加一个保存功能的需求,这样你就可以保存你的分数,然后加载他们回来。目前,当您停止应用程序时,您的数据将丢失。所以我想知道的是我必须添加什么才能让应用程序保存标签(分数),然后加载它。谢谢,伙计们,对不起,我对这些东西不太了解。

  • 我有一个Angular project web app,在我使用“ng build…”构建它之后,它正在Apache web服务器中成功运行命令现在,我想让它成为Android应用程序,为此,我尝试使用Cordova。首先,我创建了一个Cordova项目,然后在www目录下,我放置了来自NG的文件。是的,在那之前我还使用了Cordova平台add android。但是,当我在模拟器或真实设备上安装

  • 这是我从网站上获取的JSON代码。问题是此代码没有方括号,并且在数组中没有有效值,因此我不知道如何在android应用程序中使用此代码。 {"h0":{"id": 1081,"imgtitle":{"ar_AA":"",""fa_IR":"\u0644\u062d\u0638\u0647\u0631\u0633\u06cc\u062f\u0646...","en_GB":""},"imgtext"

  • 问题内容: 我正在将以下JSON字符串发送到我的服务器。 在服务器上,我有这个。 当我发送字符串时,它表明我得到了200的响应,但是其他两种方法从未运行。这是为什么? 问题答案: 我认为您正在将对象的使用与的使用混为一谈。 该对象用于将HTTP响应发送回调用方客户端,而您想访问的正文。请参阅此答案,它提供了一些指导。 如果您使用的是有效的JSON并通过进行发布,则可以使用中间件解析请求正文并将结果

  • 我正在向服务器发送以下JSON字符串。 我在服务器上有这个。 当我发送字符串时,它显示我得到了一个200的响应,但是那些其他两个方法从来没有运行过。这是为什么?

  • 问题内容: 我们已经发布了几年前基于JDK 5开发的分布式Web应用程序。 JMX将如何帮助该应用程序? 1)它可以帮助我监视性能(内存,CPU,网络和磁盘IO)吗? 2)如果是这样,则应用程序部署在多台服务器中,如何在一个仪表板中进行监视? 3)是否必须对现有应用程序进行任何新的代码更改,或者可以在不更改代码的情况下进行监视? 4)除了性能监控,我们还能做什么?由于名称是Management E