1

これは私の問題です。いくつかの値を格納するように SQLite DB をセットアップしています。この場合、それは非常に単純です。2 つの列 (_id、名前)。データがデータベースに格納されていることはわかっており、その情報を渡すために使用しているカーソルもデータを取り込んでいることがわかっています。ただし、カーソル値を ArrayList に追加しようとすると、エラーが発生します。これは私の問題メソッドのコードです:

public void sqltest(LDatabase LConnector){
     cursor = LConnector.getAllRecords(); //gets the cursor from my db 
     try{
     cursor.moveToFirst();}
     catch (Exception e){
          log.i("Failed", "Couldn't moveToFirst"); //I get a successful moveToFirst
     }
     while(cursor.moveToNext()){
         try{
         getWork.add(cursor.getString(cursor.getColumnIndex("name")));
        } catch (Exception h){
         Log.i("FAILED", cursor.getString(cursor.getColumnIndex("name")));
     }
  }

その位置でのカーソルの値を教えてくれる最後のログを設定しました。DB に入力された値は常に出力されるので、カーソルが入力されていることがわかります。ここで私が間違っていることを誰か知っていますか?

編集:アクティビティの開始時にこれが呼び出された後、LogCat は次の 2 行を示します。

04-12 23:26:26.606: I/MOVED(9478): MOVED TO FIRST
04-12 23:26:26.606: I/FAILED(9478): test1

それをよりよく説明する詳細なエラーはこれ以上ありません。そのため、私はとても混乱しています。AssetList にはまったく保存されません。

これは getAllRecords() メソッドのコードです:

public Cursor getAllLifts() throws SQLiteException
{
    open();
    return database.rawQuery("SELECT * FROM  contacts"+";", null);  
}

さらに、作成コードと挿入に使用されるコードは次のとおりです。

作成:

 String createQuery = "CREATE TABLE contacts" +
     "(_id auto_increment integer primary key," +
     "name text);";

  db.execSQL(createQuery); // execute the query

挿入: open(); // データベースを開きます。database.execSQL("INSERT INTO 連絡先(名前) 値('test2')");}

catch (Exception insert){
   Log.i("INSERT", "INSERT FAILED");
}
close(); // close the database

編集: インポートを伴うアクティビティの残りの部分

package com.jydev.llogger2;

import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.database.Cursor;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Create extends Activity implements OnClickListener {

Button buttonNext; //continue button
Button buttonBack; //back button
EditText nameEditText; //editText w/ workout name
EditText commentEditText; //editText w/ comments
Intent info; //intent used to pass extras
String wName = null; 
String wComments = null; 
ArrayList<String> getWork;
Cursor cursor;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.create);

    commentEditText = (EditText)findViewById(R.id.commentEditText);
    buttonBack = (Button)findViewById(R.id.create_back);
    buttonNext = (Button)findViewById(R.id.create_continue);
    nameEditText = (EditText)findViewById(R.id.nameEditText);

    LtDatabase LConnector = new LDatabase(this);
    LConnector.insert();
    sqltest(LConnector);

}
4

2 に答える 2

2

間違っていることがいくつかあります。最初の moveToFirst() はブール値を返すため、例外がスローされることはありません。次に、moveToNext() を呼び出すため、while ステートメントは 1 行スキップするため、最初の行がスキップされます。最後に、getwork を初期化していないため、例外が発生します。

public void sqltest(LDatabase LConnector)
{
     cursor = LConnector.getAllRecords(); //gets the cursor from my db 

     if (cursor.moveToFirst())
     { 
        do 
        {
            try{
            getWork.add(cursor.getString(cursor.getColumnIndex("name")));
            } catch (Exception h){
            Log.i("FAILED", cursor.getString(cursor.getColumnIndex("name")));  
            }
          while (cursor.moveToNext()); 
          }
     }
 }  

getWork の宣言で

ArrayList<String> getWork = new ArrayList<String>();
于 2013-04-13T05:05:38.023 に答える
1

私のクエリでは、次を使用しています

public ArrayList<T> findAllBy(String selection) {
    final SQLiteDatabase db = HELPER.getReadableDatabase();     
    final ArrayList<T> result = new ArrayList<T>();
    final Cursor cursor = db.query(TABLE_NAME, SELECTED_COLS, WHERE, null, null, null, null);

    try {
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            T model = CREATEOBJECT(cursor);
            result.add(model);
            cursor.moveToNext();
        }

        return result;
    } finally {
        cursor.close();
        db.close();
    }
}

どこ:

  • HELPERから拡張されたインスタンスですSQLiteOpenHelper
  • TABLE_NAMEテーブル名の文字列です
  • SELECTED_COLS取得したい列名を持つ String[] 配列です
  • WHERE"COL_NAME = 'value'"またはのような文字列ですnull
  • CREATEOBJECTT私の中で欲しい型のオブジェクトを作成するためのメソッドですArrayList<T>

CREATEOBJECT

public T CREATEOBJECT(Cursor cursor) {
    new T(
        cursor.getInt(0), cursor.getString(1)
    );
}

public class T {
    private long   id; 
    private String name;    

    T(int id, String name) {
        this.id = id;
        this.name = name;
    }
    //...
}
于 2013-04-13T05:20:47.047 に答える