1

这是我的问题:我设置了一个 SQLite DB 来存储一些值。在这种情况下,它非常简单。两列(_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")));
     }
  }

我设置了最后一个日志来告诉我光标在那个位置的值。为数据库输入的值总是打印出来,所以我知道光标正在被填充。有人知道我在这里做错了什么吗?

编辑:当活动开始时,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

插入:打开();// 打开数据库 try{ // 稍后添加更多以从 usr 获取要插入的数据,只是为了测试 database.execSQL("INSERT INTO contacts(name) VALUES('test1')"); database.execSQL("插入联系人(姓名) VALUES('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

有几个错误的事情。First moveToFirst() 返回一个布尔值,因此您永远不会抛出异常。其次,由于您调用 moveToNext(),while 语句将跳过一行,因此跳过了第一行。最后,你得到一个异常,因为你没有初始化 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
  • 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;
    }
    //...
}
于 2013-04-13T05:20:47.047 回答