尝试从数据库中检索值时SQLite数据库错误

时间:2013-04-24 09:28:53

标签: java android sqlite select

我有一个活动,我在其中将值插入sqlite表,然后查询表以获取值。

活动

public class TableActivity extends Activity {

    TableLayout follow_up_table;
    TableRow followup_tr_data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_table);

        follow_up_table=(TableLayout) findViewById(R.id.follow_up_table);

        //---------------Essay Title Table Header-----------------------------------------------
        TableRow essay_title_tr_head = new TableRow(this);
        essay_title_tr_head.setId(10);
        essay_title_tr_head.setBackgroundResource(R.drawable.list_header);
        essay_title_tr_head.setLayoutParams(new LayoutParams(
        LayoutParams.FILL_PARENT,
        LayoutParams.WRAP_CONTENT));


        TextView label_essay_title = new TextView(this);
        label_essay_title.setId(20);
        label_essay_title.setText("Time");
        label_essay_title.setTextColor(Color.WHITE);
        label_essay_title.setPadding(5,5,5,5);
        essay_title_tr_head.addView(label_essay_title);// add the column to the table row here
        label_essay_title.setTextSize(12);    

        TextView label_description = new TextView(this);
        label_description.setId(20);
        label_description.setText("Student Name");
        label_description.setTextColor(Color.WHITE);
        label_description.setPadding(5,5,5,5);
        essay_title_tr_head.addView(label_description);// add the column to the table row here
        label_description.setTextSize(12);    



        follow_up_table.addView(essay_title_tr_head, new TableLayout.LayoutParams(
                LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));

      //---------------Essay Title Table Header-----------------------------------------------

        //getTime();

        // database handler
       insertData("Morning", "2013-04-23 10:00:00", "Suresh Kumar");
       insertData("Morning", "2013-04-23 11:30:00", "Pravat Das");
       insertData("Evening", "2013-04-23 16:16:00", "Namita Roy");
       insertData("Evening", "2013-04-23 17:30:00", "Rakesh Mitra");
       insertData("After noon", "2013-04-23 10:00:00", "Anil Sarma");

       getTime();
    }

    public void getTime()
    {
        // database handler
         // database handler
        DatabaseHandler db = new DatabaseHandler(getApplicationContext());

        // Spinner Drop down elements
        List<String> lables = db.getTime();
        Iterator itr = lables.iterator();
        while(itr.hasNext())
        {
            System.out.println(itr.next());
        }

    }

    //method to insert data into local database
    public void insertData(String timeName, String time, String studentName)
    {
        DatabaseHandler db = new DatabaseHandler(TableActivity.this);
        ContentValues values = new ContentValues();
        //db.createDataBase();
         values.put("timeName",timeName);
         values.put("time",time);
         values.put("studentName",studentName);

         db.insertValues(timeName, time, studentName);
        db.close();

    }

}

数据库帮助程序类

public class DatabaseHandler extends SQLiteOpenHelper {
    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "counselor";

    // Labels table name
    private static final String TABLE_LABELS = "follow_up";

    // Labels Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_time_name = "time_name";
    private static final String KEY_time = "time";
    private static final String KEY_student_name = "student_name";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        // Category table create query
        String CREATE_CATEGORIES_TABLE = "CREATE TABLE follow_up (_id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , time_name VARCHAR, time DATETIME, student_name VARCHAR)";
        db.execSQL(CREATE_CATEGORIES_TABLE);
    }

    // Upgrading database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_LABELS);

        // Create tables again
        onCreate(db);
    }

    public void insertValues(String timeName, String time, String studentName)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        String sql = "INSERT INTO follow_up ( time_name, time, student_name) VALUES ('"+timeName+"', '"+time+"', '"+studentName+"')";
        Cursor cursor = db.rawQuery(sql, null); //<< execute here 
           cursor.moveToFirst();
           db.close();
    }


// 
//    /**
//     * Getting all labels
//     * returns list of labels
//     * */
    public List<String> getTime(){
        List<String> labels = new ArrayList<String>();

        // Select All Query
        String selectQuery = "SELECT time_name FROM follow_up ORDER BY time";

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                labels.add(cursor.getString(1));
            } while (cursor.moveToNext());
        }

        // closing connection
        cursor.close();
        db.close();

        // returning lables
        return labels;
    }
}

logcat中的错误

04-24 09:21:18.187: D/dalvikvm(1260): GC_FOR_ALLOC freed 66K, 7% free 2561K/2748K, paused 169ms, total 183ms
04-24 09:21:18.207: I/dalvikvm-heap(1260): Grow heap (frag case) to 3.222MB for 635812-byte allocation
04-24 09:21:18.328: D/dalvikvm(1260): GC_FOR_ALLOC freed 2K, 6% free 3179K/3372K, paused 116ms, total 116ms
04-24 09:21:18.467: D/dalvikvm(1260): GC_CONCURRENT freed <1K, 6% free 3190K/3372K, paused 9ms+27ms, total 141ms
04-24 09:21:19.167: E/CursorWindow(1260): Failed to read row 0, column 1 from a CursorWindow which has 5 rows, 1 columns.
04-24 09:21:19.167: D/AndroidRuntime(1260): Shutting down VM
04-24 09:21:19.167: W/dalvikvm(1260): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
04-24 09:21:19.197: E/AndroidRuntime(1260): FATAL EXCEPTION: main
04-24 09:21:19.197: E/AndroidRuntime(1260): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ica.dynamictable/com.ica.dynamictable.TableActivity}: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.os.Looper.loop(Looper.java:137)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at java.lang.reflect.Method.invokeNative(Native Method)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at java.lang.reflect.Method.invoke(Method.java:511)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at dalvik.system.NativeStart.main(Native Method)
04-24 09:21:19.197: E/AndroidRuntime(1260): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.database.CursorWindow.nativeGetString(Native Method)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.database.CursorWindow.getString(CursorWindow.java:434)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.ica.commons.DatabaseHandler.getTime(DatabaseHandler.java:77)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.ica.dynamictable.TableActivity.getTime(TableActivity.java:83)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at com.ica.dynamictable.TableActivity.onCreate(TableActivity.java:73)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.Activity.performCreate(Activity.java:5104)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
04-24 09:21:19.197: E/AndroidRuntime(1260):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
04-24 09:21:19.197: E/AndroidRuntime(1260):     ... 11 more

实际上我要做的是将所有time_name放入一个列表中,以便我可以使用它来填充表格。

我哪里错了?

3 个答案:

答案 0 :(得分:2)

在您的DBHelper getTime()方法中,您使用查询只获取一行。稍后在该方法中,您使用的是labels.add(cursor.getString(1));

您应该使用labels.add(cursor.getString(0));,因为Cursor

中只有一行

答案 1 :(得分:1)

cursor.getString(1)应为cursor.getString(0),因为在查询"SELECT time_name FROM follow_up ORDER BY time";中,您只能在time_name 0获得一个数据,即cursor.getString(0) p>

答案 2 :(得分:0)

SELECT time_name FROM follow_up ORDER BY time

只包含1列。因此它的索引是0.你可以用

访问它
labels.add(cursor.getString(0));

或者,更干净:

int index = cursor.getColumnIndex("time_name");

labels.add(cursor.getString(index));

此外,我应该补充一点,if ... do ... while可以替换为单个while(cursor.moveToNext())块,因为新创建的光标的位置始终在第一个之前,使得第一个moveToNextmoveToFirst

有效相同
相关问题