2012-04-11 2 views
1

EDIT:アプリはAndroidのバージョン2.3.5「SQLiteException:データベースファイルを開くことができません」最初(アンドロイド2.3.5)市場への.apkファイルをアップロードした後

Iと携帯電話でクラッシュし昨日、Google Playの私の最初のアプリをアップロードし、今日私はエラーレポートを得たfollwoing:

android.database.sqlite.SQLiteException: unable to open database file 
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1956) 
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:918) 
at com.hazcheck.dgl.data.ExternalDBOpenHelper.openDataBase(ExternalDBOpenHelper.java:96) 
at com.hazcheck.dgl.SearchActivity.afterTextChanged(SearchActivity.java:284) 
at android.widget.TextView.sendAfterTextChanged(TextView.java:6566) 
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:6989) 
at android.text.SpannableStringBuilder.sendTextHasChanged(SpannableStringBuilder.java:897) 
at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:353) 
at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269) 
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432) 
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:409) 
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:28) 
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:679) 
at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:185) 
at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:120) 
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:332) 
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:86) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:143) 
at android.app.ActivityThread.main(ActivityThread.java:4268) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 

編集:ここに私のSQLiteOpenHelperクラスがあり、私は何か間違ったことかもしれない、それをチェックアウトしてください:

package com.hazcheck.dgl.data; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.BufferedInputStream; 
import java.io.ByteArrayOutputStream; 
//import java.util.zip.ZipInputStream; 

import com.hazcheck.dgl.R; 

import android.content.Context; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 
//import android.content.res.Resources; 

public class ExternalDBOpenHelper extends SQLiteOpenHelper{ 

    //public static int DB_PATH_ID; 
    public static String DB_NAME; 
    public static String DB_PATH; 
    public static int DB_VERSION; 
    public SQLiteDatabase database; 
    public final Context context; 

    //private Resources resources; 

    public SQLiteDatabase getDb() { 
     return database; 
    } 
     public ExternalDBOpenHelper(Context context) { 
     super(context, DB_NAME = context.getString(R.string.app_data_name), null, DB_VERSION = Integer.parseInt((context.getString(R.string.app_database_version)))); 
     this.context = context; 
     String packageName = context.getPackageName(); 
     //resources = context.getResources(); 
     //DB_PATH_ID = R.raw.imdg35; 
     DB_PATH = String.format("//data//data//%s//databases//", packageName); 

     openDataBase(); //createDataBase(); 
    } 


    public void createDataBase() { 
     boolean dbExist = checkDataBase(); 
     if (!dbExist) { 
      this.getReadableDatabase(); 
      try { 
       copyDataBase(); 
      } catch (IOException e) { 
       Log.e(this.getClass().toString(), "Copying error"); 
       throw new Error("Error copying database!"); 
      } 
     } else { 
      Log.i(this.getClass().toString(), "Database already exists"); 
     } 
    } 

    private boolean checkDataBase() { 
     String path = DB_PATH + DB_NAME; 
     File dbFile = new File(path); 
     return dbFile.exists(); 
    } 

    private void copyDataBase() throws IOException { 
     InputStream externalDbStream = context.getAssets().open(DB_NAME); 

     String outFileName = DB_PATH + DB_NAME; 

     OutputStream localDbStream = new FileOutputStream(outFileName); 

    byte[] buffer = new byte[1024]; 
    int bytesRead; 
    while ((bytesRead = externalDbStream.read(buffer)) > 0) { 
     localDbStream.write(buffer, 0, bytesRead); 
    } 

    localDbStream.close(); 
    externalDbStream.close(); 
/* String outFileName = DB_PATH + DB_NAME; 
    InputStream is = resources.openRawResource(DB_PATH_ID); 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is)); 
    try { 
     while (zis.getNextEntry() != null) { 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      byte[] buffer = new byte[1024]; 
      int count; 
      while ((count = zis.read(buffer)) != -1) { 
       baos.write(buffer, 0, count); 
       //Log.d("", buffer.toString()); 
      } 
      baos.writeTo(myOutput); 
     } 
    } 
    finally{ 
     zis.close(); 
     myOutput.flush(); 
     myOutput.close(); 
     is.close(); 
    }*/ 
} 

public SQLiteDatabase openDataBase() throws SQLException { 
    String path = DB_PATH + DB_NAME; 
    if (database == null) { 
     createDataBase(); 
     database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE); 
    } 
    return database; 
} 
@Override 
public synchronized void close() { 
    if (database != null) { 
     database.close(); 
    } 
    super.close(); 
} 
@Override 
public void onCreate(SQLiteDatabase db) {} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} 
} 
+0

SDカードへのRUコピー?SDカードがない場合SDCard内にフォルダ(mkdir)を作成していますか? –

+0

検索が行われる前にデータベースがコピーされていますか? – njzk2

+0

市場にアップロードする前に、さまざまなデバイスと異なるAndroidバージョンでアプリをテストしました。いつもうまく機能しました。いずれかがAndroid携帯を持っていれば、Google Playで「DGL」という言葉を探し、赤色のHダイヤモンドアイコンでアプリをインストールしてください –

答えて

0

問題はデータベース自体にあり、古いSqliteバージョンで作成されています。今、私はSqlite 3.7.11を使用し、データベースを再作成し、今は正常に動作します。私の場合は

0

1)この行で参照しているデータベースはどれですか:com.hazcheck.dgl.SearchActivity.afterTextChanged(SearchActivity.java:284)?それぞれのデータベースは存在しますか? OnCreate()メソッドでデータベースをインスタンス化/作成しましたか?そうでない場合は、あなたのエラーがあります。あなたはおそらくあなたが最初に作成したばかりのあなたのデバイスでアプリをテストしました。アプリケーションパッケージを置き換えてもデータベースを再利用します。

2)について「1エラーレポート、0インストール中」これは私のアプリケーションでも発生しています。おそらく、インストールの数を更新するプロセスは定期的ですが、エラーログの更新は瞬時に行われます。

+0

afterTextChangedはすでにインスタンス化されていない場合は、実際に、データベースをインスタンス化し、データベースを開く方法の検索を呼び出し、 ExternalDBOpenHelper dbOpenHelper =新しいExternalDBOpenHelper(getBaseContext())。 私は実際にはonCreate()でインスタンス化しません。 –

+0

IMHO、それ以上の問題を避けるために、onCreate()スタブにデータベースのインスタンスを作成する方がよいでしょう。プライベートフィールドのdb変数を作成すると効果的かもしれません。 – SamSPICA

+0

あなたが私に言ったことを適用してテストのために送ったので、うまくいくことを願っています。別のものは、市場の現在のものは1つのHTC WildFireで動作しませんでしたが、別の同様のデバイスHTC WildFire、奇妙な仕事をしました。私は自分の質問を編集し、データベースを読み取るために使用する別の機能を追加しました –

0
> String outFileName = DB_PATH + DB_NAME; 

これは、アプリがSDカードまたは携帯電話のメモリにインストールされているかどうかによって問題が発生する可能性があります。

クラスDatabaseContextとそのファミリー・ツリー(Activityなど)があなたに正しいディレクトリを与える必要があります方法

File getDatabasePath(String name) 

を持っています。

+0

私のcopyDataBase関数は、ファイルがまだ存在しない場合はDB_PATH + DB_NAMEを使用して新しいファイルを作成します。次に、生のフォルダにある圧縮されたデータベースを解凍し、その内容を新しく作成したファイルに移動します。 データベースパスがDB_PATH = String.Formatの( "//データ//データ//%S //データベース//" のpackageName)です。 –

+0

助けてくれてありがとう。私はあなたの解決策を試したが、うまくいかなかった。その他の提案はありますか? –

0

私はこの方法本で

private static boolean openDB(String dbPathWithName) { 
     boolean status = true; 
     try { 
      if (databaseInstance == null || !databaseInstance.isOpen()){ 
       databaseInstance = SQLiteDatabase.openDatabase(dbPathWithName, null, SQLiteDatabase.OPEN_READWRITE + SQLiteDatabase.CREATE_IF_NECESSARY); 

      } 
     } catch (Exception ex){ 
      status = false; 
      NGAndroidUtil.logErr("DataHelper", ex.getMessage(), ex); 
     } 
     return status; 
    } 

でdatabaseInstanceでデータベースを開いたとき、それは、「データベースを開くことができません」例外をスロー....これで、私はのパスを与えておりませんデータベースが正しい形式でデータベースを開くことができません正しい形式でデータベースを開く...正しい形式でデータベースのパスを開きます。

関連する問題