将游标值传递给ArrayList

时间:2013-04-13 04:14:13

标签: android sqlite

这是我的问题:我设置了一个SQLite数据库来存储一些值。在这种情况下,它非常简单。两列(_id,name)。我知道数据存储在数据库中,我知道我用来传递信息的光标也在填充。但是,当我尝试将一个游标值添加到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会显示以下两行:

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

插入:     打开(); //打开数据库     尝试{            //稍后添加更多数据以从usr插入数据,仅用于测试        database.execSQL(“INSERT INTO contacts(name)VALUES('test1')”);        database.execSQL(“INSERT INTO contacts(name)VALUES('test2')”);}

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

编辑:其他活动w /进口

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);

}

2 个答案:

答案 0 :(得分:2)

有几件错误的事情。首先,moveToFirst()返回一个布尔值,这样你就不会抛出异常。其次,while语句将跳过一行,因为您调用moveToNext(),因此跳过第一行。最后,你得到一个例外,因为你没有初始化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>();

答案 1 :(得分: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();
    }
}

其中:

  • HELPERSQLiteOpenHelper
  • 的实例扩展
  • TABLE_NAME是一个包含表名
  • 的字符串
  • SELECTED_COLS是一个String []数组,列名为“我想要”
  • WHERE是一个类似"COL_NAME = 'value'"null
  • 的字符串
  • CREATEOBJECT是一种在T
  • 中创建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;
    }
    //...
}