在Android的Google Nexus One中将数据库从RES文件夹复制到本地数据库?
我正在开发一个Android应用程序,在应用程序启动时,我将数据库从RES文件夹复制到本地数据库,为应用程序创建一个SQLite数据库。除了HTC Google Nexus One设备外,它在其他所有设备和所有操作系统版本中都能正常工作。 我第二次问这个问题是因为我试图用另一种方式找到解决方案。 我使用下面的代码将数据库复制到本地数据库在Android的Google Nexus One中将数据库从RES文件夹复制到本地数据库?,android,sqlite,Android,Sqlite,我正在开发一个Android应用程序,在应用程序启动时,我将数据库从RES文件夹复制到本地数据库,为应用程序创建一个SQLite数据库。除了HTC Google Nexus One设备外,它在其他所有设备和所有操作系统版本中都能正常工作。 我第二次问这个问题是因为我试图用另一种方式找到解决方案。 我使用下面的代码将数据库复制到本地数据库 public class ECatalogueDatabase { private static final String DB_PATH = "/d
public class ECatalogueDatabase {
private static final String DB_PATH = "/data/data/com.weg.ecatalogue/databases/";
public static final String DATABASE_NAME = "ECatalogue";
public static final String DATABASE_TABLE = "T_Electrical";
public static final int DATABASE_VERSION = 1;
public static final String KEY_ROWID="id";
public static final String KEY_PRODUCT_LINE="productline";
public static final String KEY_VOLTAGE="voltage";
public static final String KEY_OUTPUTHP="outputhp";
public static final String KEY_FRAME="frame";
public static final String KEY_RPM="rpm";
private Context context=null;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
private static final String CREAT_DATABASE="Create Table if not exists "+ DATABASE_TABLE+"("+ KEY_ROWID +" INTEGER PRIMARY KEY NOT NULL,"
+KEY_PRODUCT_LINE +" nvarchar ,"+ KEY_OUTPUTHP+" numeric ,"+ KEY_RPM +" nvarchar ,"+KEY_VOLTAGE +" nvarchar ," +KEY_FRAME +" nvarchar"+")";
/**
* Constructor - takes the context to allow the database to be
* opened/created
*
* @param ctx the Context within which to work
*/
public ECatalogueDatabase(Context ctx) {
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
//Helper class
private static class DatabaseHelper extends SQLiteOpenHelper
{
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREAT_DATABASE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS titles");
onCreate(db);
}
}
public ECatalogueDatabase open() //throws SQLException
{
try
{
db=DBHelper.getWritableDatabase();
}catch(Exception exception)
{
exception.printStackTrace();
}
return null;
}
public void close()
{
DBHelper.close();
}
/**
* Creates a empty database on the system and rewrites it with your own database.
* */
public void createDataBase() throws IOException{
@SuppressWarnings("unused")
boolean dbExist = checkDataBase();
/**
* CHANGES DONE BY SHAILESH SHARMA TO SOLVE THE PROBLEM OF 2.2 HTC DESIRE IN CLIENT'S WIFE DEVICE :(
*/
SQLiteDatabase db_Read = null;
if(dbExist){
//DO NOTHING IN THIS CASE
}else{
db_Read = DBHelper.getReadableDatabase();
db_Read.close();
}
//=================================
try {
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(){
try{
String myPath = DB_PATH + DATABASE_NAME;
//db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READONLY);
}catch(SQLiteException e){
}
if(db != null){
db.close();
}
return db != 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{
InputStream myInput = context.getAssets().open(DATABASE_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DATABASE_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
public int getDatabaseCount(){
int count = 0;
Cursor cursor = db.rawQuery("Select * from " + DATABASE_TABLE, null);
if(cursor!=null){
count = cursor.getCount();
}
cursor.deactivate();
cursor.close();
return count;
}
}
我已经找到了解决这个问题的方法,现在我只想和大家分享一下。 我得到的例外
CREATE TABLE android_metadata failed
Failed to setLocale() when constructing, closing the database
android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
这是一个完全不同的问题,我只在HTC Nexus ONE这样的少数设备上遇到过,它在所有操作系统和所有其他设备上都能工作
当我们创建数据库时,会自动生成一个名为“android_table”的表,我删除了该表,并在SQLite管理器中手动重新创建了该表。通过以下两个查询步骤:
CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')
及
在这一步之后,当我运行代码时,我在圣诞节前得到了惊喜。我的申请现在运行良好
所有的功劳都归功于我的长期研发,以及我经过这么多努力而获得的这个环节:
http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/
您好Yaqub,感谢您的回复,但我也遵循相同的代码,这两个代码没有太大区别…检查此示例项目,它应该可以工作:没有Yaqub,它仍然不工作,仅在Nexus中…我在其他android设备上尝试了您的代码,它们工作正常。:(奇怪的是,我已经试过了,而且它可以在所有模拟器上运行……我没有“HTC谷歌Nexus One设备”。
http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/