这是我的问题:我设置了一个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);
}
答案 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();
}
}
其中:
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;
}
//...
}