java - 如何访问 Android 中现有的 .db 文件?

标签 java android database

我似乎无法访问 Android 中现有的 .db 文件。我已将文件 Zones.db 复制到\MyApp\app\src\main\assets 中,并创建了一个 DatabaseHelper 类,如下所示:

public class DatabaseHelper extends SQLiteOpenHelper {

//The Android's default system path of your application database.
String DB_PATH =null;

private static String DB_NAME = "Zones";

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;
    DB_PATH="/data/data/"+context.getPackageName()+"/"+"databases/";
}

/**
 * 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 {
            //<div style="display:none"></div>
                    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) {
}

//return cursor
public Cursor query(String table,String[] columns, String selection,String[] selectionArgs,String groupBy,String having,String orderBy){
    return myDataBase.query("Zones", null, null, null, null, null, null);    
}

和一个如下所示的 MainActivity 类:

public class MainActivity extends Activity {
    Cursor c = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DatabaseHelper myDbHelper = new DatabaseHelper(MainActivity.this);

        try
        {
            myDbHelper.createDataBase();
        }
        catch (IOException ioe)
        {
            throw new Error("Unable to create database");
        }

        myDbHelper.openDataBase();

        Toast.makeText(MainActivity.this, "Success", Toast.LENGTH_SHORT).show();

        c = myDbHelper.query("EMP_TABLE", null, "_id=3", null, null,null, null);

        if(c.moveToFirst())
        {
            Toast.makeText(MainActivity.this,
                "_id: " + c.getString(0) + "\n" +
                "ZONE_LETTER: " + c.getString(1) + "\n" +
                "ZONE_NUMBER: " + c.getString(2) + "\n" +
                "ZONE_TIME: " + c.getString(3) + "\n" +
                "ZONE_PRICE: " + c.getString(4) + "\n" +
                "PHONE_NUMBER: " + c.getString(5) + "\n" +
                "COMPANY: " + c.getString(6),
                Toast.LENGTH_LONG).show();
        }
    }

当我运行应用程序时,出现 no such table 错误,指出它无法在区域数据库中找到区域表。有谁知道如何解决这个问题吗?

最佳答案

尝试这个代码,它的工作完美,只需更改您的表名称和包名称

public class SqlLiteDataBaseHelper extends SQLiteOpenHelper{
    private static final String TAG = SqlLiteDataBaseHelper.class.getSimpleName();
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_PATH = "/data/data/YOUR PACKAGE NAME/databases/";
    private static final String DATABASE_NAME = "test1.sqlite";
    private static final String TABLE_NAME = "Student";
    private static final String COL_Name = "Name";
    private static final String COL_ROLL_NO ="RollNo";
    private Context context;
    private SQLiteDatabase db;

    public SqlLiteDataBaseHelper(Context context) {
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }


    //This method is just retuning total no of recode in your table Getting single contact count
    public int  getDataCount() {

        String userRollNo = null;

        String query = "SELECT * FROM " + TABLE_NAME ;

        Cursor cursor = db.rawQuery(query, null);

        return cursor.getCount();
    }




    public void openDataBase () throws SQLException{
        String path = DATABASE_PATH+DATABASE_NAME;
        db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.CREATE_IF_NECESSARY);
    }

    public void CopyDataBaseFromAsset() throws IOException {
        InputStream in  = context.getAssets().open(DATABASE_NAME);
        Log.e("sample", "Starting copying");
        String outputFileName = DATABASE_PATH+DATABASE_NAME;
        File databaseFile = new File( "/data/data/YOUR PACKAGE NAME/databases");
        // check if databases folder exists, if not create one and its subfolders
        if (!databaseFile.exists()){
            databaseFile.mkdir();
        }

        OutputStream out = new FileOutputStream(outputFileName);

        byte[] buffer = new byte[1024];
        int length;


        while ((length = in.read(buffer))>0){
            out.write(buffer,0,length);
        }
        Log.e("sample", "Completed" );
        out.flush();
        out.close();
        in.close();

    }

    public void deleteDb() {
        File file = new File(DATABASE_PATH);
        if(file.exists()) {
            file.delete();
            Log.d(TAG, "Database deleted.");
        }
    }
    public boolean checkDataBase() {
        boolean checkDB = false;
        try {
            File file = new File(DATABASE_PATH);
            checkDB = file.exists();
        } catch(SQLiteException e) {
            Log.d(TAG, e.getMessage());
        }
        return checkDB;
    }
}

在您的 Activity 中使用

sqlLiteDataBaseHelper = new SqlLiteDataBaseHelper(this);


        try {

            if(sqlLiteDataBaseHelper.checkDataBase()){

                Log.e(TAG,"Data Base Already Exists");

            }else {

                sqlLiteDataBaseHelper.CopyDataBaseFromAsset();

            }

        }catch (Exception e){
            e.printStackTrace();
        }
        try {

            sqlLiteDataBaseHelper.openDataBase();
             // after open data  base u can read write data base 

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

关于java - 如何访问 Android 中现有的 .db 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37654803/

相关文章:

java - 在 MacOS Mojave 上安装 pymssql 时出现问题

android - 如何避免 Android 中的 ProgressDialog

c# - Xamarin.Forms:Map.IsShowingUser 未显示当前位置?

mysql - 从 MySQL 数据库中搜索 LongBlob 列中的文本

java - Akka http 使用 java - 从 RequestEntity 获取字符串

java - Android:当url包含http时,在设置WebViewCore之前不支持removeMessages(int what = 107)

java - 将 Facebook 登录与 Play Framework 集成的库?

java - 将字符串从 EditText 转换为整数会导致应用程序在启动前停止工作

sql - 什么是涵盖索引?

java - 使用数据库查询更新 JTable