【问题标题】:Get List<string> from db class and store in other class从 db 类获取 List<string> 并存储在其他类中
【发布时间】:2015-11-25 20:45:26
【问题描述】:

我正在我的 db 类 (SQLDatabaseHelper.java) 中创建一系列问题,并有一个方法可以创建 ListArray 以供其他类使用:

public List<List<String>> getAllAnswersByQuestion2() {
    List<String> array1 = new ArrayList<String>();    
    List<String> array2 = new ArrayList<String>();  

    //Clear arrays just in case they still existed and had values
    array1.clear();
    array2.clear();

    SQLiteDatabase db = this.getReadableDatabase();

   //Get 5 random values from the questions table
    String selectQuery = "SELECT DISTINCT questionDescr, answerSetId FROM " + TABLE_QUESTION + " ORDER BY RANDOM() LIMIT 5";

   Cursor c = db.rawQuery(selectQuery, null);   

   try {

       //Ignore any null values in the table, go the first value
    if (c!= null && c.moveToFirst())

   {
       do {

     //Create two strings  - one for all question descriptions and one for answersetIDs
     String questdescr = c.getString(c.getColumnIndex(QDESCR));
     String answerSetIds = c.getString(c.getColumnIndex(ASID)); 

     //Put these strings into two separate arrays
     array1.add(questdescr);
     array2.add(answerSetIds);

     //And when all values have been put into arrays......
    } while (c.moveToNext());

 }

    //Create another array to bundle up the two arrays already created
   List< List<String> > listArray = new ArrayList< List<String> >();

   //Clear this array just in case of residual values
   listArray.clear();

   listArray.add(array1);
   listArray.add(array2);

   //Return this array to be picked up in the 'showRandomNextQuestion' method
   return listArray;

} finally {

    //Close cursor and database to prevent memory leaks
        c.close();            
        db.close();
        }
}

我有一个单独的类 (QuizQuestionBank.java),它尝试获取返回的 ListArray 并将其拆分为两个单独的 List 以供进一步使用:

import java.util.List;

import android.app.Application;

public class QuizQuestionBank extends Application {

Object db;

@SuppressWarnings("unused")
private List<String> questionStrings;

public List<String> getQuestionStrings() {

SQLDatabaseHelper db = new SQLDatabaseHelper(QuizQuestionBank.this);

//get the data from the database
List<List<String>> listList = db.getAllAnswersByQuestion2();

//Get the question/text/answer Strings
List<String> questionStrings = listList.get(0); //question Strings

return questionStrings;
}

public List<String> setQuestionStrings(List<String> questionStrings) {
return this.questionStrings = questionStrings;
}

}

最后我有一个 MainActivity 尝试从我的 QuizQuestionBank 类中获取列表,并使用它来获取其中的值,然后输出到文本视图中:

private class showNextRandomQuestion1 extends AsyncTask<Void, Void, String> {

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

                    QuizQuestionBank qb = new QuizQuestionBank();

                       //question Strings
                       List<String> questionStrings = qb.getQuestionStrings();

                        //Generate random index
                        Random r = new Random();
                        int rand = Math.abs((r.nextInt() % questionStrings.size()));

                        String questionString = questionStrings.get(rand);  

                        //remove and square brackets from array of strings
                        String regex = "\\[|\\]";
                        aQuestionString = questionString.replaceAll(regex, "");
                        return aQuestionString; 
                }

                @Override
                protected void onPostExecute(String result) {
                    //take returned question from above and display it
                     questionView.setText(aQuestionString); 
                }

            }

但是,当我的“showNextRandomQuestion1()”方法被调用时,我目前收到以下错误:

08-31 19:24:55.637: I/Choreographer(20638): Skipped 63 frames!  The application may be doing too much work on its main thread.
08-31 19:24:55.887: I/ActivityManager(20638): Timeline: Activity_idle id: android.os.BinderProxy@41ec2f08 time:939408562
08-31 19:25:01.887: W/dalvikvm(20638): threadid=13: thread exiting with uncaught exception (group=0x41a71d88)
08-31 19:25:02.037: E/AndroidRuntime(20638): FATAL EXCEPTION: AsyncTask #2
08-31 19:25:02.037: E/AndroidRuntime(20638): Process: com.example.quizapp, PID: 20638
08-31 19:25:02.037: E/AndroidRuntime(20638): java.lang.RuntimeException: An error occured while executing doInBackground()
08-31 19:25:02.037: E/AndroidRuntime(20638):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at java.lang.Thread.run(Thread.java:841)
08-31 19:25:02.037: E/AndroidRuntime(20638): Caused by: java.lang.NullPointerException
08-31 19:25:02.037: E/AndroidRuntime(20638):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:263)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at com.example.quizapp.SQLDatabaseHelper.getAllAnswersByQuestion2(SQLDatabaseHelper.java:445)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at com.example.quizapp.QuizQuestionBank.getQuestionStrings(QuizQuestionBank.java:20)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at com.example.quizapp.MainActivity$showNextRandomQuestion1.doInBackground(MainActivity.java:371)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at com.example.quizapp.MainActivity$showNextRandomQuestion1.doInBackground(MainActivity.java:1)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-31 19:25:02.037: E/AndroidRuntime(20638):    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-31 19:25:02.037: E/AndroidRuntime(20638):    ... 4 more
08-31 19:25:02.227: W/dalvikvm(20638): threadid=14: thread exiting with uncaught exception (group=0x41a71d88)
08-31 19:25:02.227: I/Process(20638): Sending signal. PID: 20638 SIG: 9

当我的 QuizQuestionBank 类尝试从 db 助手类中检索 listarray 时,它似乎遇到了初始问题。有人知道我需要做什么来解决这个问题吗?非常感谢

【问题讨论】:

  • 包含您的完整 mainActivity 代码
  • 另外,SQLDatabaseHelper.java 中的第 445 行是哪一行?
  • 第 445 行' SQLiteDatabase db = this.getReadableDatabase();'
  • 所以 SQLDatabaseHelper 扩展了 SQLLiteDatabase?还是你自己写的 getReadableDatabase() 方法?
  • SQLDatabaseHelper 扩展了 SQLiteOpenHelper

标签: java android list get return


【解决方案1】:

在您的 onPostExecute 中试试这个:

改变这个

questionView.setText(aQuestionString); 

questionView.setText(result); 

【讨论】:

    猜你喜欢
    • 2023-01-10
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    相关资源
    最近更新 更多