База данных Android не возвращает записей, но sqlitebrowser содержит данные

У меня проблема с файлом базы данных, который не читается. Я добавил файл базы данных в активы с именем mydb, но когда я запускаю свой код, он говорит, что он не находится. Он вызывает это всплывающее уведомление Toast.makeText(this, «Контакт не найден», Toast.LENGTH_LONG).show(); Это вызывается, потому что никакие записи не возвращаются. Также я знаю, что он находит файл, поскольку исключения FileNotFoundException нет. Это пример из книги по разработке приложений для Android.

public class DatabaseActivity extends Activity {
    /** Called when the activity is first created. */
    TextView quest, response1, response2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView quest = (TextView) findViewById(R.id.quest);


        try {           
            String destPath = "/data/data/" + getPackageName() + "/databases/MyDB";
            File f = new File(destPath);            
            if (!f.exists()) {          
                CopyDB( getBaseContext().getAssets().open("mydb"), 
                    new FileOutputStream(destPath));
            }
        } catch (FileNotFoundException e) {         
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        DBAdapter db = new DBAdapter(this); 


        //---get a contact---
        db.open();
        Cursor c = db.getContact(2);
        if (c.moveToFirst())        
            DisplayContact(c);
        else
            Toast.makeText(this, "No contact found", Toast.LENGTH_LONG).show();
        db.close();



    }

    public void CopyDB(InputStream inputStream, OutputStream outputStream) 
    throws IOException {
        //---copy 1K bytes at a time---
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, length);
        }
        inputStream.close();
        outputStream.close();
    }

    public void DisplayContact(Cursor c)
    {
    quest.setText(String.valueOf(c.getString(1)));      
        //quest.setText(String.valueOf("this is a text string"));    
    } 
}

Есть ли лучший способ загрузить данные.


person al23dev    schedule 05.06.2012    source источник


Ответы (1)


Тут на ум приходит пара вещей...

  1. из-за проверки !f.exists(), то, как только база данных существует (и, возможно, пуста), она никогда не будет копировать ее снова. Так что, может быть, пока что копируйте его все время, пока не отработаете перегибы, а затем добавьте в !f.exists()

  2. У меня были смешанные результаты с e.printStackTrace(), возможно, измените на Log.e(TAG, "message", e) и посмотрите, начнете ли вы видеть ошибки, отображаемые в LogCat.

Что касается лучшего способа... Я сделал это несколькими разными способами... 1. Создать файл (json, cvs и т. д.), а затем обработать и загрузить его, если база данных пуста 2. Аналогично первый, за исключением того, что я создаю сериализованный массив объектов java и загружаю его в базу данных, если база данных пуста.

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

person stuckless    schedule 05.06.2012
comment
спасибо попробую. Я не думаю, что это DBAdapter, поскольку я использовал его для других примеров, и он работает хорошо. У меня только что были проблемы с добавлением файла db в активы и его чтение. Загружается нормально. Кажется, что данные просто не считываются в курсор, поэтому их можно вывести в файл макета xml. - person al23dev; 05.06.2012
comment
Но открывается ли DBAdapter то же место, что и String destPath = "/data/data/" + getPackageName() + "/databases/MyDB";? (тот же регистр в имени файла и т. д.). Возможно, вы копируете базу ресурсов в другой файл? - person stuckless; 05.06.2012
comment
это было имя таблицы, которую я исправил, таблица называлась basic_table, и это, похоже, не сработало. поэтому я удалил подчеркивание. Я также принял ваш совет не использовать printStackTrace(). Также спасибо за совет по оператору !if.exists() - person al23dev; 05.06.2012