2014-04-18 57 views
0

我想在數據庫首次加載數據時實現進度對話框。在數據庫創建時創建進度對話框時出錯

這是我的代碼

 DictionaryOpenHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mHelperContext = context; 

    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 

      mDatabase = db; 
      mDatabase.execSQL(ENG_FRA_TABLE_CREATE); 
      loadDictionaryEngFra(); 
      new InitDB().execute(); 


    } 


    public class InitDB extends AsyncTask<Void, Void, Void> { 


     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = ProgressDialog.show(mHelperContext, "", "Wait", true); 


     } 

     @Override 
     protected Void doInBackground(Void... params) { 


      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      pDialog.dismiss(); 
     } 
    } 

如果我嘗試運行與此進度對話框中的應用程序,它拋出這個錯誤列表

04-18 23:16:30.886: E/SQLiteLog(26059): (1) no such table: ENG_FRAdictionary 
04-18 23:16:30.896: E/SQLiteDatabase(26059): Error inserting suggest_text_1=abbey suggest_text_2=n. a monastery ruled by an abbot 
04-18 23:16:30.896: E/SQLiteDatabase(26059): android.database.sqlite.SQLiteException: no such table: ENG_FRAdictionary (code 1): , while compiling: INSERT INTO ENG_FRAdictionary(suggest_text_1,suggest_text_2) VALUES (?,?) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:686) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1573) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1445) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper.addWordEngFra(DictionaryDatabaseEngFra.java:238) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper.loadWordsEngFra(DictionaryDatabaseEngFra.java:218) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper.access$1(DictionaryDatabaseEngFra.java:208) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper$1.run(DictionaryDatabaseEngFra.java:200) 
04-18 23:16:30.896: E/SQLiteDatabase(26059): at java.lang.Thread.run(Thread.java:856) 
04-18 23:16:30.896: E/DictionaryDatabaseEngFra(26059): unable to add word: abbey 
04-18 23:16:30.896: W/dalvikvm(26059): threadid=14: thread exiting with uncaught exception (group=0x41d24930) 
04-18 23:16:30.896: E/AndroidRuntime(26059): FATAL EXCEPTION: Thread-51326 
04-18 23:16:30.896: E/AndroidRuntime(26059): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.searchtoto/databases/dictionaryEngFra 
04-18 23:16:30.896: E/AndroidRuntime(26059): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55) 
04-18 23:16:30.896: E/AndroidRuntime(26059): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1543) 
04-18 23:16:30.896: E/AndroidRuntime(26059): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1445) 
04-18 23:16:30.896: E/AndroidRuntime(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper.addWordEngFra(DictionaryDatabaseEngFra.java:238) 
04-18 23:16:30.896: E/AndroidRuntime(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper.loadWordsEngFra(DictionaryDatabaseEngFra.java:218) 
04-18 23:16:30.896: E/AndroidRuntime(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper.access$1(DictionaryDatabaseEngFra.java:208) 
04-18 23:16:30.896: E/AndroidRuntime(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper$1.run(DictionaryDatabaseEngFra.java:200) 
04-18 23:16:30.896: E/AndroidRuntime(26059): at java.lang.Thread.run(Thread.java:856) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): Search suggestions query threw an exception. 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.view.ViewRootImpl.setView(ViewRootImpl.java:804) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:265) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:73) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.app.Dialog.show(Dialog.java:282) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.app.ProgressDialog.show(ProgressDialog.java:116) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.app.ProgressDialog.show(ProgressDialog.java:99) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper$InitDB.onPreExecute(DictionaryDatabaseEngFra.java:174) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.os.AsyncTask.execute(AsyncTask.java:534) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra$DictionaryOpenHelper.onCreate(DictionaryDatabaseEngFra.java:162) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra.query(DictionaryDatabaseEngFra.java:113) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at com.example.searchtoto.dictionary.en.DictionaryDatabaseEngFra.getWordMatchesEngFra(DictionaryDatabaseEngFra.java:96) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at com.example.searchtoto.dictionary.en.DictionaryProviderEngFra.getSuggestions(DictionaryProviderEngFra.java:107) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at com.example.searchtoto.dictionary.en.DictionaryProviderEngFra.query(DictionaryProviderEngFra.java:81) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.content.ContentProvider.query(ContentProvider.java:652) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.content.ContentProvider$Transport.query(ContentProvider.java:189) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.content.ContentResolver.query(ContentResolver.java:375) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.content.ContentResolver.query(ContentResolver.java:318) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.app.SearchManager.getSuggestions(SearchManager.java:930) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.widget.SuggestionsAdapter.runQueryOnBackgroundThread(SuggestionsAdapter.java:200) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.widget.CursorFilter.performFiltering(CursorFilter.java:49) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.os.Looper.loop(Looper.java:137) 
04-18 23:16:30.996: W/SuggestionsAdapter(26059): at android.os.HandlerThread.run(HandlerThread.java:60) 

whitout進度對話框的實施,應用程序運行細

這是活動

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.HashMap; 
import android.app.ProgressDialog; 
import android.app.SearchManager; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteQueryBuilder; 
import android.os.AsyncTask; 
import android.os.Environment; 
import android.provider.BaseColumns; 
import android.text.TextUtils; 
import android.util.Log; 


/** 
* Contains logic to return specific words from the dictionary, and 
* load the dictionary table when it needs to be created. 
*/ 
public class DictionaryDatabaseEngFra extends SearchableDictionaryEngFra{ 
private static final String TAG = "DictionaryDatabaseEngFra"; 

//The columns we'll include in the dictionary table 
public static final String KEY_WORD_ENG_FRA = SearchManager.SUGGEST_COLUMN_TEXT_1; 
public static final String KEY_DEFINITION_ENG_FRA = SearchManager.SUGGEST_COLUMN_TEXT_2; 


private static final String DATABASE_NAME = "dictionaryEngFra"; 
private static final String ENG_FRA_TABLE = "ENG_FRAdictionary"; 


private static final int DATABASE_VERSION = 2; 

private final DictionaryOpenHelper mDatabaseOpenHelper; 
private static final HashMap<String,String> mColumnMapEngFra = buildColumnMapEngFra(); 

static File ENG_FRA = new File(Environment.getExternalStorageDirectory().getPath() + "/dic/dictionary/engfra./", "eng_fra.txt"); 



/** 
* Constructor 
* @param context The Context within which to work, used to create the DB 
*/ 
public DictionaryDatabaseEngFra(Context context) { 
    mDatabaseOpenHelper = new DictionaryOpenHelper(context); 
} 

/** 
* Builds a map for all columns that may be requested, which will be given to the 
* SQLiteQueryBuilder. This is a good way to define aliases for column names, but must include 
* all columns, even if the value is the key. This allows the ContentProvider to request 
* columns w/o the need to know real column names and create the alias itself. 
*/ 
private static HashMap<String,String> buildColumnMapEngFra() { 
    HashMap<String,String> mapEngFra = new HashMap<String,String>(); 
    mapEngFra.put(KEY_WORD_ENG_FRA, KEY_WORD_ENG_FRA); 
    mapEngFra.put(KEY_DEFINITION_ENG_FRA, KEY_DEFINITION_ENG_FRA); 
    mapEngFra.put(BaseColumns._ID, "rowid AS " + 
      BaseColumns._ID); 
    mapEngFra.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID, "rowid AS " + 
      SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); 
    mapEngFra.put(SearchManager.SUGGEST_COLUMN_SHORTCUT_ID, "rowid AS " + 
      SearchManager.SUGGEST_COLUMN_SHORTCUT_ID); 
    return mapEngFra; 
} 

public Cursor getWordEngFra(String rowId, String[] columns) { 
    String selection = "rowid = ?"; 
    String[] selectionArgs = new String[] {rowId}; 

    return query(selection, selectionArgs, columns); 

} 


public Cursor getWordMatchesEngFra(String query, String[] columns) { 
    String selection = KEY_WORD_ENG_FRA + " MATCH ?"; 
    String[] selectionArgs = new String[] {query+"*"}; 

    return query(selection, selectionArgs, columns); 
} 


private Cursor query(String selection, String[] selectionArgs, String[] columns) { 
    /* The SQLiteBuilder provides a map for all possible columns requested to 
    * actual columns in the database, creating a simple column alias mechanism 
    * by which the ContentProvider does not need to know the real column names 
    */ 
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 
    builder.setTables(ENG_FRA_TABLE); 



    builder.setProjectionMap(mColumnMapEngFra); 


    Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(), 
      columns, selection, selectionArgs, null, null, null); 

    if (cursor == null) { 
     return null; 
    } else if (!cursor.moveToFirst()) { 
     cursor.close(); 
     return null; 
    } 
    return cursor; 
} 


/** 
* This creates/opens the database. 
*/ 
private static class DictionaryOpenHelper extends SQLiteOpenHelper { 

    private final Context mHelperContext; 
    private SQLiteDatabase mDatabase; 

    /* Note that FTS3 does not support column constraints and thus, you cannot 
    * declare a primary key. However, "rowid" is automatically used as a unique 
    * identifier, so when making requests, we will use "_id" as an alias for "rowid" 
    */ 



    private static final String ENG_FRA_TABLE_CREATE = 
       "CREATE VIRTUAL TABLE " + ENG_FRA_TABLE + 
       " USING fts3 (" + 
       KEY_WORD_ENG_FRA + ", " + 
       KEY_DEFINITION_ENG_FRA + ");"; 



    DictionaryOpenHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mHelperContext = context; 

    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 

      mDatabase = db; 
      mDatabase.execSQL(ENG_FRA_TABLE_CREATE); 
      loadDictionaryEngFra(); 
      new InitDB().execute(); 
    } 


    public class InitDB extends AsyncTask<Void, Void, Void> { 


     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = ProgressDialog.show(mHelperContext, "", "Wait", true); 


     } 

     @Override 
     protected Void doInBackground(Void... params) { 


      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      pDialog.dismiss(); 
     } 
    } 

    /** 
    * Starts a thread to load the database table with words 
    */ 
    private void loadDictionaryEngFra() { 
     new Thread(new Runnable() { 
      public void run() { 
       try { 
        loadWordsEngFra(); 
       } catch (IOException e) { 
        throw new RuntimeException(e); 
       } 
      } 
     }).start(); 
    } 

    private void loadWordsEngFra() throws IOException { 
     Log.d(TAG, "Loading words eng_fra..."); 
     FileInputStream fileInputStream = new FileInputStream(ENG_FRA); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); 

     try { 
      String line; 
      while ((line = reader.readLine()) != null) { 
       String[] strings = TextUtils.split(line, "-"); 
       if (strings.length < 2) continue; 
       long id = addWordEngFra(strings[0].trim(), strings[1].trim()); 
       if (id < 0) { 
        Log.e(TAG, "unable to add word: " + strings[0].trim()); 
       } 
      } 
     } finally { 
      reader.close(); 
     } 
     Log.d(TAG, "DONE loading words."); 
    } 

    /** 
    * Add a word to the dictionary. 
    * @return rowId or -1 if failed 
    */ 
    public long addWordEngFra(String word, String definition) { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_WORD_ENG_FRA, word); 
     initialValues.put(KEY_DEFINITION_ENG_FRA, definition); 

     return mDatabase.insert(ENG_FRA_TABLE, null, initialValues); 
    } 



    /** 
    * Add a word to the dictionary. 
    * @return rowId or -1 if failed 
    */ 


    @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 " + ENG_FRA_TABLE); 

     onCreate(db); 

    } 


} 

} 
+0

您的sqlite幫助程序中存在問題。您應該發佈dbhelper類的完整代碼。 – Setu

回答

0

這看起來像一個SQL錯誤。

04-18 23:16:30.896: E/SQLiteDatabase(26059): Error inserting suggest_text_1=abbey suggest_text_2=n. a monastery ruled by an abbot 
04-18 23:16:30.896: E/SQLiteDatabase(26059): android.database.sqlite.SQLiteException: no such table: ENG_FRAdictionary (code 1): , while compiling: INSERT INTO ENG_FRAdictionary(suggest_text_1,suggest_text_2) VALUES (?,?) 

它看起來不像您的ENG_FRAdictionary表存在。

0

問題出在你的sqlite數據庫。我看不到進度對話框有問題 檢查你的db創建語句和表名。還請檢查sqlitehelper類 並讓我們知道會發生什麼

+0

這個錯誤發生只是如果我實現進度對話框,沒有它,數據庫不會給我任何錯誤 – Bombolo

+0

因爲你給無效的上下文 ProgressDialog.show(mHelperContext,「」,「等」,真); mHelperCOntext是爲字典助手定義的(我知道它是最終的) 您可以嘗試將它發送給asynctask ..並且它必須是一個活動上下文而不是應用程序上下文 – mha90

+0

感謝您的回答。問題是如果我嘗試設置pDialog = ProgressDialog.show(DictionaryDatabaseEngFra.this,「」,「Wait」,true);我收到一個錯誤沒有封閉類型DictionaryDatabaseEngFra的實例可以在範圍內訪問 – Bombolo