gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:50:04 25 4
gpt4 key购买 nike

我似乎无法访问 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com