Ошибка копирования базы данных Android sqlite в реальном телефоне HTC - PullRequest
0 голосов
/ 27 июля 2011

Мне нужно настроить 2 базы данных для одного приложения. Я сделал и работаю нормально в эмуляторе. Эмулятор minSDKVersion: 8 реальная версия телефона: 2.2.1. ИТ поддержка. Когда я настраивал базу данных в реальном телефоне, я не мог ее настроить. Я всегда не могу создать базу данных. Я думаю, что одна укоренилась, потому что, когда я иду в File исследовать -> данные. Я не могу открыть папку данных.

У меня есть сомнения в apk, потому что размер моего приложения составляет 8 МБ. Он содержит базу данных в папке ресурсов. Этот размер составляет 4,65 МБ. Но размер файла apk составляет 1.14MB.

Как это будет читать из папки активов (в реальном телефоне)?

Я действительно не знаю, правильно это или неправильно .. Это мои сомнения. Пожалуйста, объясните мне.

Я получил сообщение об ошибке:

enter image description here Пожалуйста, помогите мне.

Есть ли какая-то ошибка в моей части кода или в чем-то другом?

Пожалуйста, помогите мне.

Заранее спасибо ....

Отредактировано

Это мой код для copyDatabase:

открытый класс DataBaseMasterHelper расширяет SQLiteOpenHelper {

// The Android's default system path of your application database.
private static String DB_PATH = "/data/data/com.android.xont.controller/databases/";
private static String DB_NAME = "MasterUserVentura_HEMA.db";
private SQLiteDatabase ventura;
private  Context myContext;
private DataBaseHelper myDbHelper;

public DataBaseMasterHelper(Context context) {
    super(context, DB_NAME, null, 1);
    this.myContext = context;
}

/**
 * Creates a empty database on the system and rewrites it with your own
 * database.
 **/
public void createDataBase() throws IOException {

    boolean dbExist = checkDataBase();
    File Path = myContext.getDir("Data", 0);
    File DBFile = new File(Path, DB_NAME);
    System.out.println("-------" + DB_NAME);
    if(!DBFile.exists())  //Need to copy...
        copyDataBase(myContext, DBFile);

}

public boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READONLY);
    } catch (SQLiteException e) {
        e.printStackTrace();
    }

    if (checkDB != null) {
        checkDB.close();
    }

    return checkDB != null ? true : false;
}

private void copyDataBase(Context Ctxt, File DBFile) throws IOException {
    InputStream myInput = myContext.getAssets().open(DB_NAME);
    String outFileName = DB_PATH + DB_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 void openDataBase() throws SQLException {
    String myPath = DB_PATH + DB_NAME;
    ventura = SQLiteDatabase.openDatabase(myPath, null,
            SQLiteDatabase.OPEN_READONLY);

}

@Override
public synchronized void close() {
    if (ventura != null)
        super.close();
        ventura.close();
}

и звонить так:

  MyGrid.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position,long id) {

            if (position == 0) {
                try {
                    myDbMasterHelper.createDataBase();
                    Toast.makeText(DatabaseSetupActivity.this, "Successfully copied database",Toast.LENGTH_SHORT).show();
                } catch (IOException ioe) {
                    Toast.makeText(DatabaseSetupActivity.this, "Unable to create database",Toast.LENGTH_SHORT).show();
                    ioe.printStackTrace();
                }catch (Exception ioe) {
                    Toast.makeText(DatabaseSetupActivity.this, "Unable to create database",Toast.LENGTH_SHORT).show();
                    ioe.printStackTrace();
                }


            }else if (position == 1) {
                try {
                    myDbHelper.createDataBase();
                    Toast.makeText(DatabaseSetupActivity.this, "Successfully copied database",Toast.LENGTH_SHORT).show();
                } catch (IOException ioe) {
                    Toast.makeText(DatabaseSetupActivity.this, "Unable to create database",Toast.LENGTH_SHORT).show();
                    ioe.printStackTrace();

                }catch (Exception ioe) {
                    Toast.makeText(DatabaseSetupActivity.this, "Unable to create database",Toast.LENGTH_SHORT).show();
                    ioe.printStackTrace();
                }



            }
        }
    });

нормально работает эмулятор. Если проблема с размером файла, то в эмуляторе также должна быть ошибка get?

Я получил такую ​​ошибку:

 java.io.FileNotFoundException: /data/data/com.android.xont.controller/databases /MasterUserVentura_HEMA.db (No such file or directory)

Я изменил e.printStackTrace () вместо исключения броска.

Я думаю, это не проблема размера файла. Потому что я сделал то же самое в маленьком размере 300 КБ (testng2.db). Это тоже выдает ту же ошибку

Мой настоящий телефон - HTC HD2 - это его Windows Mobile® 6.5 Professional.

Пожалуйста, помогите мне.

Заранее спасибо ...

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Проблема в том, что вы не можете прочитать данные из папки ресурсов. Убедитесь, что DB_NAME имеет форму "mydatabase.db" (включая расширение). Попробуйте использовать строчные буквы, возможно, они чувствительны к регистру.

0 голосов
/ 27 июля 2011

Спасибо за публикацию вашего исходного кода, я вижу проблему в методе: copyDataBase(), потому что неправильный путь DB_NAME, правильный "database / MasterUserVentura_HEMA.db" Попробуйте это:

InputStream myInput = myContext.getAssets().open("databases/MasterUserVentura_HEMA.db");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...