1

Я загружаю файл базы данных в активы, называемые mydb. Затем я использую приведенный ниже код для загрузки файла базы данных в эмулятор. Это работает иногда, но не всегда. Я перезагрузил eclipse, и файл базы данных загрузился правильно. Я не могу заставить его работать на реальном устройстве. Я пробовал это с другим проектом экспериментальных файлов. Я думаю, что есть настройка, которую я не настроил правильно, но я не уверен. Любая помощь будет принята с благодарностью.андроид галактики s реальный файл базы данных устройства для исключения нулевой точки

методы пытались

  1. Я пытался использовать android_meta таблицу, так как это было предположить, чтобы устранить проблемы баз данных не загружены.

  2. У меня также есть записи с использованием такого синтаксиса. Это даже будет работать на устройстве жизни long id = db.insertContact («Wei-Meng Lee», «[email protected]»); Этот код snipet взят из книги развития андроида

  3. Я внесение изменений коды, где указанные в примере

всего журнал неисправности

06-21 15: 17: 56.792: E/AndroidRuntime (556): FATAL EXCEPTION: main 06-21 15: 17: 56.792: E/AndroidRuntime (556): java.lang.RuntimeException: не удается запустить Activity ComponentInfo {alex.android.test.db/alex. android.test.db.AndroidtestdbActivity}: android.database.sqlite.SQLiteException: нет такой таблицы: contacts:, при компиляции: SELECT DISTINCT _id, name , email FROM contacts WHERE _id = 2 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1956) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1981) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.app.ActivityThread.access $ 600 (ActivityThread .java: 123) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1147) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.os.Handler.dispatchMessage (Handler.java:99) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.os.Looper.loop (Looper.java : 137) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.app.ActivityThread.main (ActivityThread. java: 4424) 06-21 15: 17: 56.792: E/AndroidRuntime (556): при java.lang.reflect.Method.invokeNative (собственный метод) 06-21 15: 17: 56.792: E/AndroidRuntime (556)): at java.lang.reflect.Method.invoke (Method.java:511) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:784) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:551) 06-21 15:17 : 56.792: E/AndroidRuntime (556): at dalvik.system.NativeStart.main (родной метод) 06-21 15: 17: 56.792: E/AndroidRuntime (556): вызвано: android.database.sqlite.SQLiteException: нет такой таблицы: контакты: при компиляции: SELECT DISTINCT _id, name, email FROM contacts WHERE _id = 2 06-21 15: 17: 56.792: E/AndroidRuntime (556): при droid.database.sqlite.SQLiteCompiledSql.native_compile (собственный метод) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.database.sqlite.SQLiteCompiledSql. (SQLiteCompiledSql.java:68) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.database.sqlite.SQLiteProgram.compileSql (SQLiteProgram.java:143) 06-21 15: 17: 56.792: E/AndroidRuntime (556): у android. database.sqlite.SQLiteProgram.compileAndbindAllArgs (SQLiteProgram.java: 361) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:127) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:94) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.database.sqlite.SQLiteQuery. (SQLiteQuery.java : 53) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDriver.java:47) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase.java:1564) 06-21 15: 17: 56.792: E/AndroidRuntime (556): на android.database.sqlite.SQLiteDatabase.queryWithFactory (SQLiteDatabase .java: 1449) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at andro id.database.sqlite.SQLiteDatabase.query (SQLiteDatabase.java:1405) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at alex.android.test.db.DBAdapter.getContact (DBAdapter.java: 163) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at alex.android.test.db.AndroidtestdbActivity.onCreate (AndroidtestdbActivity.java:32) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.app.Activity.performCreate (Activity.java:4465) 06-21 15: 17: 56.792: E/AndroidRuntime (556): at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java: 1049) 06-21 15: 17: 56,792: Е/AndroidRuntime (556): в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:1920)

общественного класса DBAdapter {

private static final String DB_NAME = "MyDB"; 
private static final int DB_VERSION = 1; 
public static final String KEY_ROWID = "_id"; 
    public static final String KEY_NAME = "name"; 
    public static final String KEY_EMAIL = "email"; 
    private static final String TAG = "DBAdapter"; 
    private static final String DATABASE_TABLE = "contacts"; 

private static Context c; 
private SQLiteDatabase db; 
private SQLiteOpenHelper sqlDBHelp; 

/** 
* Constructor for the SQL DB Adapter, copy DB from assets if not exists in /data/data/<package-name>/databases 
* 
* @param c 
*/ 
public DBAdapter(Context c) { 
    super(); 
    DBAdapter.c = c; 
    sqlDBHelp = new SqlDBHelper(); 
} 

/** 
* Open the SQL DB as Writable 
*/ 
public void openDB() { 
    try { 
     db = sqlDBHelp.getWritableDatabase(); 
    } catch (SQLiteException ex) { 
     Toast.makeText(c, "DB with filename " + DB_NAME + "coudn't be opend!", Toast.LENGTH_SHORT); 
    } 
} 

/** 
* Close the SQL DB 
*/ 
public void closeDB() { 
    db.close(); 
} 

/** 
* Helper class for the SQL DB Adapter 
*/ 
static class SqlDBHelper extends SQLiteOpenHelper { 

    private static final String DB_PATH = "/data/data/" + c.getPackageName() + "/databases/" + DB_NAME; 

    public SqlDBHelper() { 
     super(c, DB_NAME, null, DB_VERSION); 
     createDB();  
    } 

    private void createDB() { 

     SharedPreferences prefs = c.getSharedPreferences("sharedPrefs", 0); 
     boolean dbExists = prefs.getBoolean("dbExists", false); 
     Log.d("PM.ADA.SDA", "DB Exists : " + dbExists); 
     if (!dbExists) { 
      this.getReadableDatabase(); 
      copyDB(); 
      prefs.edit().putBoolean("dbExists", true).commit(); 
     } 
    } 


    public void onCreate(SQLiteDatabase db) { 
     /* 
     try { 
      db.execSQL(DATABASE_TABLE); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     */ 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS contacts"); 
      onCreate(db); 


    } 

    public void copyDB() { 
     try {    
      InputStream is = c.getAssets().open(DB_NAME); 
      BufferedInputStream bis = new BufferedInputStream(is); 
      OutputStream os = new FileOutputStream(DB_PATH); 
      BufferedOutputStream bos = new BufferedOutputStream(os); 

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

      while ((length = bis.read(buffer)) > 0) { 
       bos.write(buffer, 0, length); 
      } 

      bos.flush(); 
      bos.close(); 
      bis.close(); 

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

} 

public long insertContact(String name, String email) 
{ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_NAME, name); 
    initialValues.put(KEY_EMAIL, email); 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

//---deletes a particular contact--- 
public boolean deleteContact(long rowId) 
{ 
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; 
} 

//---retrieves all the contacts--- 
public Cursor getAllContacts() 
{ 
    return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, 
      KEY_EMAIL}, null, null, null, null, null); 
} 

//---retrieves a particular contact--- 
public Cursor getContact(long rowId) throws SQLException 
{ 
    Cursor mCursor = 
      db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
      KEY_NAME, KEY_EMAIL}, KEY_ROWID + "=" + rowId, null, 
      null, null, null, null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

//---updates a contact--- 
public boolean updateContact(long rowId, String name, String email) 
{ 
    ContentValues args = new ContentValues(); 
    args.put(KEY_NAME, name); 
    args.put(KEY_EMAIL, email); 
    return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
} 

}

другая деятельность имя TextView;

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

    DBAdapter db = new DBAdapter(this); 
    name = (TextView)findViewById(R.id.name); 



    //---get a contact--- 
    db.openDB(); 
    Cursor c = db.getContact(2); 
    if (c.moveToFirst()) 
    { 
     DisplayContact(c); 
    name.setText(String.valueOf(c.getString(1))); 
    } 
    else 
     name.setText("not found"); 
     Toast.makeText(this, "No contact found", Toast.LENGTH_LONG).show(); 
    db.closeDB(); 

} 

public void DisplayContact(Cursor c) 
{ 
    Toast.makeText(this, 
      "id: " + c.getString(0) + "\n" + 
      "Name: " + c.getString(1) + "\n" + 
      "Email: " + c.getString(2), 
      Toast.LENGTH_LONG).show(); 


} 

}

+0

Я запутался ... ошибка вы вывесили есть 'в alex.android.test.db.DBAdapter $ DatabaseHelper .copyDataBase (DBAdapter.java:88) ', но я не вижу этот метод в любом месте кода, который вы разместили. – Barak

+0

Я еще раз обновил код и использовал другое сообщение, которое я нашел – alex

+0

Похоже, что ваша БД копируется сейчас ... но я уверен, что вы удалили таблицу контактов ... Я предполагаю, что база данных имеет номер версии из 1, закодированных в нем, но ваш код Java имеет версию 2, поэтому он вызвал метод onUpgrade, который удалил таблицу контактов, а затем вызвал ваш пустой 'onCreateMethod', который ничего не сделал. Если это так, измените номер своей версии на один, удалите приложение и переустановите, и вы можете быть в бизнесе. – Barak

ответ

1

Я вижу несколько отличий от того, как я это делаю ... Вы пропускаете outputStream.flush(), и я называю this.getReadableDatabase();, прежде чем начать свой процесс копирования и this.close(); после.

Для справки, вот как я это делаю, и это работает прекрасно:

private static class DatabaseHelper extends SQLiteOpenHelper { 
    DatabaseHelper(Context context, String dbname, int dbversion) { 
     super(context, dbname, null, dbversion); 
     if (checkDataBase(dbname)) { 
      openDataBase(dbname); 
     } else { 
      try { 
       this.getReadableDatabase(); 
       copyDataBase(dbname); 
       this.close(); 
       openDataBase(dbname); 
      } catch (IOException e) { 
       throw new Error("Error copying database"); 
      } 
      Toast.makeText(context, 
        "Initial " + dbname + " database has been created", 
        Toast.LENGTH_LONG).show(); 
     } 
    } 


public DBAdapter(Context ctx) { 
    DBAdapter.mCtx = ctx; 
} 

private static boolean checkDataBase(String dbname) { 
    SQLiteDatabase checkDB = null; 
    boolean exist = false; 
    try { 
     String db = MAIN_DB_PATH + dbname; 
     checkDB = SQLiteDatabase.openDatabase(db, null, 
       SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLiteException e) { 
     Log.v("db log", "database does't exist"); 
    } 
    if (checkDB != null) { 
     exist = true; 
     checkDB.close(); 
    } 
    return exist; 
} 

private static void copyDataBase(String dbname) throws IOException { 
    InputStream myInput = mCtx.getAssets().open(dbname); 
    String outFileName = MAIN_DB_PATH + dbname; 
    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(); 
} 
+0

Я попытался реализовать ваш пример, но он, похоже, не работает. Я думаю, мне придется изменить многое из моего кода базы данных. – alex

+0

Что значит «не работает»? Была ли Сила закрыта? Ошибка в LogCat? – Barak

+0

Я думаю, что ошибка - это путь. Я не думаю, что это с базой данных. Это своего рода смысл, поскольку он работает локально, но не работает на устройстве. Поэтому я попытаюсь использовать абсолютный путь. – alex

Смежные вопросы