1

データベースクエリから返された情報をオブジェクトの配列に作成して入力しようとしています。以下のコードでは、これを正しく機能させることができないようです。

どんな助けでも大歓迎です。前もって感謝します。

モジュールオブジェクト:

public class Module {
public String moduleEnglishTitle;
public String moduleJapaneseTitle;
public String moduleCompletionRate;
public int moduleRating;
public Module() {
    super();
}

public Module(String moduleEnglishTitle, String moduleJapaneseTitle, String moduleCompletionRate, int moduleRating) {
    super();
    this.moduleEnglishTitle = moduleEnglishTitle;
    this.moduleJapaneseTitle = moduleJapaneseTitle;
    this.moduleCompletionRate = moduleCompletionRate;
    this.moduleRating = moduleRating;
}

}

オブジェクトのこれらの4つの変数は、データベースから、データが使用されるアクティビティのModuleオブジェクト配列に入力されます。次に、このデータは、カスタムArrayAdapterを使用してListViewに入力されます。これを使用してリストを手動で作成すると、ArrayAdapter、Listview、およびModuleオブジェクトはすべて一緒にうまく機能します。

Module module_data[] = new Module[] {
            new Module("hello","hello","hello", 3),
            new Module("hello","hello","hello", 2)
    };

ただし、この方法でデータを入力するのではなく、次のカーソルを使用してデータベースのデータを使用します。

public Cursor getModuleList() {
    Cursor mCursor = myDataBase.rawQuery("SELECT mod, engtitle, japtitle FROM master WHERE type='module'", null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

私はこれまでこのコードを持っていますが、機能していません:

    Module module_data[] = new Module[moduleInfo.getCount()];
    int i = 0;
    while(moduleInfo.isAfterLast()) {

        module_data[i].moduleJapaneseTitle = moduleInfo.getString(1);
        module_data[i].moduleEnglishTitle = moduleInfo.getString(2);
        module_data[i].moduleCompletionRate = "済み: " + moduleStats.getString(7);
        module_data[i].moduleRating = moduleStats.getInt(4);

        moduleInfo.moveToNext();
        moduleStats.moveToNext();
        i++;
    }

................。

06-22 20:42:27.045: E/AndroidRuntime(440): FATAL EXCEPTION: main
06-22 20:42:27.045: E/AndroidRuntime(440): java.lang.RuntimeException: Unable to start activity ComponentInfo{jp.atomicideas.ne/jp.atomicideas.ne.Story2}: java.lang.NullPointerException
06-22 20:42:27.045: E/AndroidRuntime(440):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
06-22 20:42:27.045: E/AndroidRuntime(440):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
06-22 20:42:27.045: E/AndroidRuntime(440):  at android.app.ActivityThread.access$1500(ActivityThread.java:121)
06-22 20:42:27.045: E/AndroidRuntime(440):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
06-22 20:42:27.045: E/AndroidRuntime(440):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-22 20:42:27.045: E/AndroidRuntime(440):  at android.os.Looper.loop(Looper.java:130)
06-22 20:42:27.045: E/AndroidRuntime(440):  at android.app.ActivityThread.main(ActivityThread.java:3701)
06-22 20:42:27.045: E/AndroidRuntime(440):  at java.lang.reflect.Method.invokeNative(Native Method)
06-22 20:42:27.045: E/AndroidRuntime(440):  at java.lang.reflect.Method.invoke(Method.java:507)
06-22 20:42:27.045: E/AndroidRuntime(440):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
06-22 20:42:27.045: E/AndroidRuntime(440):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
06-22 20:42:27.045: E/AndroidRuntime(440):  at dalvik.system.NativeStart.main(Native Method)
06-22 20:42:27.045: E/AndroidRuntime(440): Caused by: java.lang.NullPointerException
06-22 20:42:27.045: E/AndroidRuntime(440):  at jp.atomicideas.ne.Story2.onCreate(Story2.java:59)
06-22 20:42:27.045: E/AndroidRuntime(440):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-22 20:42:27.045: E/AndroidRuntime(440):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
06-22 20:42:27.045: E/AndroidRuntime(440):  ... 11 more
4

5 に答える 5

0

ここに問題がありますwhile(moduleInfo.isAfterLast())

コードを次のスニペットに変更します。

int i = 0;
if (moduleInfo.moveToFirst() && moduleStats.moveToFirst())
{
  do {

    module_data[i].moduleJapaneseTitle = moduleInfo.getString(1);
    module_data[i].moduleEnglishTitle = moduleInfo.getString(2);
    module_data[i].moduleCompletionRate = "済み: " + moduleStats.getString(7);
    module_data[i].moduleRating = moduleStats.getInt(4);

    moduleStats.moveToNext();
    i++;
  } while (moduleInfo.moveToNext());
}
于 2012-06-22T10:57:28.160 に答える
0

使用する

 module_data[i] = new Module ();

「!」不足している..........

 while(!moduleInfo.isAfterLast()) {
        module_data[i] = new Module ();//<--------------------------
        module_data[i].moduleJapaneseTitle = moduleInfo.getString(1);
        module_data[i].moduleEnglishTitle = moduleInfo.getString(2);
        module_data[i].moduleCompletionRate = "済み: " + moduleStats.getString(7);
        module_data[i].moduleRating = moduleStats.getInt(4);

        moduleInfo.moveToNext();
        moduleStats.moveToNext();
        i++;
    }
于 2012-06-22T10:59:01.497 に答える
0

にexcalmationマークを追加しmoduleInfo.isAfterLast()ます。

于 2012-06-22T11:00:54.650 に答える
0

これを試してください。代わりにArrayListを使用しています...

Module mod;

ArrayList<Module> module_data = new ArrayList<Module>();

final Cursor cursor = db.query(DbHelper.TABLE_NAME, null, null, null, null, null, null,null );

while(cursor.moveToNext()){

mod = new Module();

module_data.add(new module(cursor.getString(0),cursor.getString(1),cursor.getString(2),cursor.getInt(3));

}

于 2012-06-22T12:38:44.683 に答える
0

私はそれをこのように解決することができました:

    Module module_data[] = new Module[moduleInfo.getCount()];
    int i;
    for(i=0; i<7; i++) {
        module_data[i] = new Module(moduleInfo.getString(1), moduleInfo.getString(2),  "済み: " + moduleStats.getString(7), moduleStats.getInt(4));
        moduleInfo.moveToNext();
        moduleStats.movetoNext();
    }

問題は、コンストラクターを介してModuleオブジェクトを誤って作成して使用していたことです。

皆さんの助けに感謝します!

于 2012-06-27T02:24:58.553 に答える