1

私が開発しているAndroidアプリでは、エントリを保存していて、それを表示したいと思っています。エントリを保存することはできますが(コードはエラーを返しません)、エントリ(つまりすべてのエントリ)を表示しようとすると、強制的に閉じられます。私を助けてください。これが私のコードです:

package com.ankita.try1;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class viewAttendance extends Activity {

LinearLayout l;
quer q;
@Override
 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_attendance);

        l=(LinearLayout)findViewById(R.id.LinearLayout);

        q= new quer(this);
        q.open();
        Cursor c1;
        c1=q.fetchAllTodos();

        long co=1;

        if(c1!=null)
        {
            do
            {
                TextView t;

                Cursor c=q.fetchTodo(co);
                String name = c.getString(c.getColumnIndexOrThrow(quer.KEY_NAME));
                String present = c.getString(c.getColumnIndexOrThrow(quer.KEY_PRESENT));
                String total = c.getString(c.getColumnIndexOrThrow(quer.KEY_TOTAL));

                int a = (Integer.parseInt(present)/Integer.parseInt(total))*100;

                String A = a+"%";

                LayoutParams la=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
                t=new TextView(this);
                t.setLayoutParams(la);
                t.setText(name+"   "+A);                                
                l.addView(t);
                co++;
            }while(co<=c1.getCount());
            q.close();
        }
        else
        {
            q.close();
            Toast.makeText(this, "No Subjects Added", Toast.LENGTH_SHORT).show();
        }



         }

}

これが私のquer.javaです(すべての関数が定義されています):

package com.ankita.try1;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import com.ankita.try1.database1;

public class quer 
{
    public static final String KEY_ROWID = "_id";
    public static final String KEY_NAME = "name";
    public static final String KEY_PRESENT = "present";
    public static final String KEY_ABSENT = "absent";
    public static final String KEY_TOTAL = "total";

    /*public static final int KEY_PRESENT=0;
    public static final int KEY_ABSENT=0;
    public static final int KEY_TOTAL=0;*/

    private static final String DATABASE_TABLE = "SUBJECT";
    private Context context;
    private SQLiteDatabase database;
    private database1 dbHelper;
    public quer(Context context) 
    {
        this.context = context;
    }

    public quer open() throws SQLException 
    {
        dbHelper = new database1(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

    public void close() 
    {
        dbHelper.close();
    }
    private ContentValues createContentValues(String name, String present, String absent,String total) 
    {
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, name);
        values.put(KEY_PRESENT, present);
        values.put(KEY_ABSENT, absent);
        values.put(KEY_TOTAL, total);
        return values;
    }
    //TO CREATE A ROW
    public long createTodo(String name, String present, String absent,String total) {
        ContentValues initialValues = createContentValues(name, present,absent,total);
                return database.insert(DATABASE_TABLE, null, initialValues);
    }
    //TOI DELETE A ROW
    public boolean deleteTodo(long rowId) 
    {
        return database.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
    }
    //FETCH ALL ROWS
    public Cursor fetchAllTodos() 
    {
        return database.query(DATABASE_TABLE, new String[] { KEY_ROWID,KEY_NAME, KEY_PRESENT, KEY_ABSENT, KEY_TOTAL}, null, null, null,null, null);
    }
    //UPDATE THE DATABASE
    public boolean updateTodo(long rowId, String name, String present, String absent,String total) 
    {
        ContentValues updateValues = createContentValues(name, present,absent,total);
        return database.update(DATABASE_TABLE, updateValues, KEY_ROWID + "="
                + rowId, null) > 0;
    }
    //FETCH ACC. TO _ID
    public Cursor fetchTodo(long rowId) throws SQLException {
        Cursor mCursor = database.query(true, DATABASE_TABLE, new String[] {
                KEY_ROWID, KEY_NAME, KEY_PRESENT, KEY_ABSENT, KEY_TOTAL },
                KEY_ROWID + "=" + rowId, null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }
    //FETCH ACC. TO NAME
    public Cursor fetchTodo(String name) throws SQLException {
        Cursor mCursor = database.query(true, DATABASE_TABLE, new String[] {
                KEY_ROWID, KEY_NAME, KEY_PRESENT, KEY_ABSENT, KEY_TOTAL },
                KEY_NAME + "=" + name, null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }
}

データベースエントリを表示できません。つまり、実行中のviewAttendanceアクティビティが表示されません-強制終了します-どこが間違っていますか?

これがlogcatです:

07-05 19:06:16.304: D/AndroidRuntime(29530): Shutting down VM
07-05 19:06:16.304: W/dalvikvm(29530): threadid=1: thread exiting with uncaught exception (group=0x40018578)
07-05 19:06:16.328: E/AndroidRuntime(29530): FATAL EXCEPTION: main
07-05 19:06:16.328: E/AndroidRuntime(29530): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ankita.try1/com.ankita.try1.viewAttendance}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1651)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.os.Looper.loop(Looper.java:130)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.app.ActivityThread.main(ActivityThread.java:3687)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at java.lang.reflect.Method.invokeNative(Native Method)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at java.lang.reflect.Method.invoke(Method.java:507)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at dalvik.system.NativeStart.main(Native Method)
07-05 19:06:16.328: E/AndroidRuntime(29530): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at com.ankita.try1.viewAttendance.onCreate(viewAttendance.java:36)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-05 19:06:16.328: E/AndroidRuntime(29530):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
07-05 19:06:16.328: E/AndroidRuntime(29530):    ... 11 more
4

1 に答える 1

2

コメントするには少し長すぎるため、これを回答に移動します。最初にスレッド内でデータベースにアクセスします。 AsyncTaskThreadsまたはを使用できますCursorLoaders

また、カーソルを移動するcursor.moveToNext()には、do-while の代わりに単純な while を使用して、afterlast でないかどうかを確認します。

while(!cursor.isAfterLast){
    cursor.moveToNext();
    //do-something
}

また、これがある場所:

c1=q.fetchAllTodos();

        long co=1;

        if(c1!=null)
        { //something } 

カーソルがnullでないことを確認していますが、カーソルが空である可能性があり、それが問題を引き起こす可能性があることを覚えておいてください(私はあなたが持っているものだと思います)。それを修正するには、次のような検証を追加します。

if(c1!=null && c1.getCount()!=0) 
 { //something } 

また、非 UI スレッド内では更新Viewできないため、ハンドラー、ポスト、またはその他のメソッドが必要になります。を使用する場合は、AsyncTaskでこれを行うことをお勧めしますonPostExecute

于 2012-07-05T21:35:07.240 に答える