2016-05-26 6 views
0

Я новичок в android и создал свое первое приложение, которое использует встроенный sqlite databse. Я заполнил базу данных, и приложение отлично работает на эмуляторе студии Android, но когда я пытаюсь получить доступ к нему на своем мобильном устройстве, приложение пуст.Невозможно создать базу данных sqlite на устройстве

Я вытащил myapp.db, а затем толкнул его на устройство:

~/Android/Sdk/platform-tools/adb -s emulator-5554 push /home/me/Desktop/myapp2/myapp.db /data/data/com.myappshop.myapp/databases/myapp.db 

Так что я могу увидеть эти файлы с помощью ADB оболочки:

[email protected]_x86_64:/data/data/com.myappshop.myapp/databases # ls -al 
-rw-rw---- u0_a72 u0_a72  16384 2016-05-20 20:04 dictionary.db 
-rw------- u0_a72 u0_a72  8720 2016-05-20 20:04 dictionary.db-journal 
-rw-rw-rw- root  root  253952 2016-05-26 01:27 myapp.db 
-rw------- u0_a72 u0_a72  8720 2016-05-23 00:53 myapp.db-journal 
-rw-rw---- u0_a72 u0_a72  20480 2016-05-18 01:30 myapp1.db 
-rw------- u0_a72 u0_a72  12824 2016-05-18 01:30 myapp1.db-journal 

Вот класс базы данных

public class DictionaryDatabase extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "myapp.db"; 
    private static final String TABLE_DICTIONARY = "dictionary"; 
    private static final String FIELD_WORD = "word"; 
    private static final String FIELD_DEFINITION = "definition"; 
    private static final int DATABASE_VERSION = 1; 


    DictionaryDatabase(Context context) { 

     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + TABLE_DICTIONARY + 
       "(_id integer PRIMARY KEY," + 
       FIELD_WORD + " TEXT, " + 
       FIELD_DEFINITION + " TEXT);"); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     //Handle database upgrade as needed 
    } 

    public void saveRecord(String word, String definition) { 
     long id = findWordID(word); 
     if (id>0) { 
      updateRecord(id, word,definition); 
     } else { 
      addRecord(word,definition); 
     } 

    } 

    public long addRecord(String word, String definition) { 
     SQLiteDatabase db = getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(FIELD_WORD, word); 
     values.put(FIELD_DEFINITION, definition); 
     return db.insert(TABLE_DICTIONARY, null, values); 
    } 
    public int updateRecord(long id, String word, String definition) { 
     SQLiteDatabase db = getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put("_id", id); 
     values.put(FIELD_WORD, word); 
     values.put(FIELD_DEFINITION, definition); 
     return db.update(TABLE_DICTIONARY, values, "_id = ?", 
       new String[]{String.valueOf(id)}); 
    } 
    public int deleteRecord(long id) { 
     SQLiteDatabase db = getWritableDatabase(); 
     return db.delete(TABLE_DICTIONARY, "_id = ?", new 
       String[]{String.valueOf(id)}); 
    } 

    public long findWordID(String word) { 
     long returnVal = -1; 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor cursor = db.rawQuery(
       "SELECT _id FROM " + TABLE_DICTIONARY + 
         " WHERE " + FIELD_WORD + " = ?", new String[]{word}); 
     Log.i("findWordID","getCount()="+cursor.getCount()); 
     if (cursor.getCount() == 1) { 
      cursor.moveToFirst(); 
      returnVal = cursor.getInt(0); 
     } 
     return returnVal; 
    } 


    public String getWord(long id) { 
     String returnVal = ""; 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor cursor = db.rawQuery(
       "SELECT word FROM " + TABLE_DICTIONARY + 
         " WHERE _id = ?", new String[]{String.valueOf(id)}); 
     if (cursor.getCount() == 1) { 
      cursor.moveToFirst(); 
      returnVal = cursor.getString(0); 
     } 
     return returnVal; 
    } 


    public String getDefinition(long id) { 
     String returnVal = ""; 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor cursor = db.rawQuery(
       "SELECT definition FROM " + TABLE_DICTIONARY + 
         " WHERE _id = ?", new String[]{String.valueOf(id)}); 
     if (cursor.getCount() == 1) { 
      cursor.moveToFirst(); 
      returnVal = cursor.getString(0); 
     } 
     return returnVal; 
    } 


    public Cursor getWordList() { 
     SQLiteDatabase db = getReadableDatabase(); 
     String query = "SELECT _id, " + FIELD_WORD + 
       " FROM " + TABLE_DICTIONARY + " ORDER BY " + FIELD_WORD + 
       " ASC"; 
     return db.rawQuery(query, null); 
    } 
} 

Я также попытался переписать класс выше, чтобы соответствовать многим ссылочным tutorial, но не удался. Так что действительно оцените вашу помощь для решения этой проблемы.

+0

'Я заполнил базу данных, и приложение отлично работает на эмуляторе, но когда я пытаюсь получить доступ к нему на мобильном телефоне, что вы подразумеваете под созданием на эмуляторе и доступом к нему на мобильном телефоне? –

+0

Я имею в виду, когда я подключаю свой мобильный телефон к своей машине разработки через USB-кабель и пытаюсь получить доступ к приложению на мобильном устройстве. – narad

+0

Что произойдет? –

ответ

0

Я думаю, что ваша проблема может быть из-за нечетной конструкции вашего адаптера «DataBase Adapter». Я всегда делаю свой класс «myDbHelper» довольно небольшим и включаю его в мой «__Name того, что DB я хочу работать над классом__DBAdapter».

Вот мой SQLiteOpenHelper, Этот класс включен в мой класс __DBAdapter.

private static class myDbHelper extends SQLiteOpenHelper { 

    public myDbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, 
         int version) { 
     super(context, name, factory, version); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Log.w(LOG_TAG, "DATABASE_CREATE: version: " + FeedContract.DATABASE_VERSION); 
     // create all table(s) for the database. 
     db.execSQL(DATABASE_TABLE_<TABLE NAME>); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Log version upgrade. 
     Log.w(LOG_TAG + "DBHelper", "Upgrading from version " + oldVersion 
       + " to " + newVersion + ", which will destroy all old data"); 

     // **** Upgrade DB **** 
     // This is where you would manually migrate your data from old DB version to new 

     // For now, drop old DB table(s) 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_<TABLE NAME>); 

     // Create a the new database. 
     onCreate(db); 
    } 

} 

Тогда в моем классе ___DBAdapter я создать SQL команды, чтобы создать таблицу (ы), что я собираюсь использовать в этой базе данных. (вместе с командами вставки/обновления/удаления/запроса). Этот подход я преподаю на своих курсах и рекомендую другим следовать при запуске. Это помогает во многих отношениях:

  • позволяет тестировать (с помощью интеграции тестов) Ваш класс «DBAdapter» легко

  • позволяет лучше разделить свой код на более мелкие разделы (более управляемые) Выделяя SQLLiteOpenHelper из остальных операций над SQLite DB.

  • позволяет использовать тот же API, что и вы, «класс DBAdapter», как то, что использует SQL, и тому, что предоставляется для поставщиков контента (обычно я (всегда есть исключения) полагаю, что вы никогда не должны делать SQL db без окружив его с Content Provider)


Создание класса SQLiteOpenHelper как можно помогает сократить код и сделать его более сговорчивым.

+0

Извините, я не мог следовать. Я скопировал свой класс db из книги «Cookbook в Android». – narad

+0

О, это интересно, потому что подход, который я обсуждал, это то, что предлагали книги Android Reto Meier, и его то, что я использовал с android 1.0 ~ ish. Редактировать выше входящего – mawalker

+0

Не могли бы вы переписать мой класс с помощью своего любимого метода, чтобы я мог попробовать? – narad

0

Я думаю, проблема заключается в том, что ваш телефон не укоренен, и вы фактически не запустили базу данных в свой телефон. Вы упомянули, что вы не можете увидеть путь /data/data/com.myappshop.myapp в своем браузере файлов.

+0

Вы имеете в виду, что мне нужно укоротить мое устройство, чтобы иметь возможность подталкивать к нему базу данных? Я этого никогда не слышал. – narad

+0

Да, вы можете получить доступ к папке с данными только тогда, когда ваше устройство внедрено. –

+0

Попробуйте следующее: http://denniskubes.com/2012/09/25/read-android-data-folder-without-rooting/ –

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