2011-08-19 14 views
0

こんにちは皆私はいくつかの困難を抱えてきました。私は大学のための私のタイムテーブルを保存するための小さなプログラムを作成しようとしています。私はSQliteデータベースに何らかの問題を抱えていましたが、それは私を困惑させました。
プログラムを最初に実行すると強制的に終了します logcatでこのエラーが発生します
原因:android.database CursorIndexOutOfBoundsException:インデックス0が要求されました。サイズが0の場合 アプリケーションを再び開くと、テーブルが作成され、アプリケーションが正常に動作します。 テーブルが最初に作成されていない理由はわかりません。
コードは次のとおりです。ここで
SqliteデータベースにアクセスするときにCursorIndexOutOfBoundsExceptionが発生する

public class Monday extends ListActivity { 
int pos = 0, timeInt, count; 
String[] times = {"0900-1030","1040-1220","Lunch 1220-1325","1325-1455", "1500-1630"}; 


String[][] content; 
String dayString = "Monday", timeString; 
EditText EditTextLesson, EditTextLocation, EditTextTutor, EditTextNotes; 
Button btnSave, btnCancel , btnDelete; 
Dialog edit;  
Intent zoom , mapweb; 
Cursor all, getRow; 


MonDBAdapter mon; 
DBAdapter db; 
ListView lv; 
@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.timetablelistview); 
    content= new String [10][10]; 
    edit = new Dialog(Monday.this); 
    lv = (ListView) findViewById(android.R.id.list); 

    lv.addFooterView(buildFooter()); 
    zoom =new Intent(this,Zoom.class); 
    mapweb =new Intent(this,MapWebView.class); 

    db = new DBAdapter(this); 
    db.open(); 
    mon = new MonDBAdapter(this); 

    mon.open(); 
    all = mon.getAllEntries(); 
    count = all.getCount(); 

    if(count < 4){   
     for(int i = 0; i < 5; i++){ 
      mon.createEntry("", "", "", ""); 
     } 

    } 
    addSections(); 

} 
public void onListItemClick(ListView parent, View v, int position, long id){ 
    switch(position){ 
    case 1: 
     timeInt= 1; 
     timeString=("0900-1030"); 
     break; 
    case 3: 
     timeInt= 2; 
     timeString=("1040-1220"); 
     break; 
    case 5: 
     timeInt= 3; 
     timeString=("1220-1325"); 
     break;    
    case 7: 
     timeInt= 4; 
     timeString=("1325-1455"); 
     break;      
    case 9: 
     timeInt= 5; 
     timeString=("1500-1630"); 
     break; 
    } 

    editDialog(); 


} 

SectionedAdapter adapter=new SectionedAdapter() { 
    protected View getHeaderView(String caption, int index, 
                   View convertView, 
                   ViewGroup parent) { 
     TextView result=(TextView)convertView; 

     if (convertView==null) { 
      result=(TextView)getLayoutInflater().inflate(R.layout.header, 
                       null); 
     } 

     result.setText(caption); 

     return(result); 
    } 
}; 
public void addSections(){ 


    all.moveToFirst(); 
    for(int i = 0; i < 5; i++){ 
     getSectionContent(
       times[i], 
       all.getString(1), 
       all.getString(2), 
       all.getString(3), 
       all.getString(4)); 
    all.moveToNext(); 
    } 
} 

public void getSectionContent(String time,String lesson,String location,String tutor,String notes){ 
    //adapter to add content to each section 
    String[] from = new String[] {"lesson", "location", "tutor", "notes"}; 
    int[] to = new int[] {R.id.textViewLesson, R.id.textViewLocation, R.id.textViewTutor, R.id.textViewNotes }; 
    // prepare the list of all records 
    List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>(); 
    HashMap<String, String> map = new HashMap<String, String>(); 
     map.put("lesson", lesson);  
     map.put("location", location); 
     map.put("tutor", tutor); 
     map.put("notes", notes);    
    fillMaps.add(map);   
    SimpleAdapter adapter1 = new SimpleAdapter(this, fillMaps, R.layout.list_view_item, from, to); 

    adapter.addSection(time,adapter1); 
    lv.setAdapter(adapter); 
} 
public void editDialog(){ 
     getRow = mon.getEntry(timeInt); 
     edit.setTitle("Edit "+ dayString + " " + timeString); 
     edit.setContentView(R.layout.edit); 
     edit.setCancelable(true);    
     btnSave = (Button)edit.findViewById(R.id.btnSave); 
     btnCancel = (Button)edit.findViewById(R.id.btnCancel); 
     btnDelete = (Button)edit.findViewById(R.id.btnDelete); 
     EditTextLesson=(EditText)edit.findViewById(R.id.editTextLesson); 
     EditTextLocation=(EditText)edit.findViewById(R.id.editTextLocation); 
     EditTextTutor=(EditText)edit.findViewById(R.id.editTextTutor); 
     EditTextNotes=(EditText)edit.findViewById(R.id.editTextNotes);                

     EditTextLesson.setText(getRow.getString(1)); 
     EditTextLocation.setText(getRow.getString(2)); 
     EditTextTutor.setText(getRow.getString(3)); 
     EditTextNotes.setText(getRow.getString(4)); 



     btnCancel.setOnClickListener(new OnClickListener() {  
       public void onClick(View v) { 
        edit.cancel(); 

         }      
       });  

     btnSave.setOnClickListener(new OnClickListener() {   
       public void onClick(View v) { 
        //starts at 1 as 0 contain the section time 
        mon.updateEntry(timeInt,EditTextLesson.getText().toString(),EditTextLocation.getText().toString(), EditTextTutor.getText().toString(),EditTextNotes.getText().toString()); 

        all.requery(); 

        adapter.sections.clear(); 
        addSections(); 
        edit.cancel();       
         }      
       });      
     btnDelete.setOnClickListener(new OnClickListener() {  
       public void onClick(View v) { 

         EditTextLesson.setText(""); 
         EditTextLocation.setText(""); 
         EditTextTutor.setText(""); 
         EditTextNotes.setText("");            
         }      
       });   
     edit.show();  




} 

private View buildFooter() { 
Button btn=new Button(this); 

    btn.setText("Campus map"); 
    btn.setTextSize(18); 
    btn.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      if(VERSION.SDK.equals("4")||VERSION.SDK.equals("3")||VERSION.SDK.equals("2")||VERSION.SDK.equals("1")){      
      startActivity(zoom); 
      }else{      
       startActivity(mapweb);      
      }  

     } 
    }); 

    return(btn); 
} 

    } 


public class DBAdapter { 

public static final String DATABASE_NAME = "timetable"; 
public static final int DATABASE_VERSION = 1; 

private static final String MONDAY = 
    "create table monday (_id integer primary key autoincrement, " 
+ MonDBAdapter.LESSON+ " TEXT," 
+ MonDBAdapter.LOCATION+ " TEXT," 
+ MonDBAdapter.TUTOR+ " TEXT," 
+ MonDBAdapter.NOTES+ " TEXT" + ");"; 

private static final String TUESDAY = 
    "create table tuesday (_id integer primary key autoincrement, " 
+ MonDBAdapter.LESSON+ " TEXT," 
+ MonDBAdapter.LOCATION+ " TEXT," 
+ MonDBAdapter.TUTOR+ " TEXT," 
+ MonDBAdapter.NOTES+ " TEXT" + ");"; 

private static final String WEDNESDAY = 
    "create table wednesday (_id integer primary key autoincrement, " 
+ MonDBAdapter.LESSON+ " TEXT," 
+ MonDBAdapter.LOCATION+ " TEXT," 
+ MonDBAdapter.TUTOR+ " TEXT," 
+ MonDBAdapter.NOTES+ " TEXT" + ");"; 

private static final String THURSDAY = 
    "create table thursday (_id integer primary key autoincrement, " 
+ MonDBAdapter.LESSON+ " TEXT," 
+ MonDBAdapter.LOCATION+ " TEXT," 
+ MonDBAdapter.TUTOR+ " TEXT," 
+ MonDBAdapter.NOTES+ " TEXT" + ");"; 

private static final String FRIDAY = 
    "create table friday (_id integer primary key autoincrement, " 
+ MonDBAdapter.LESSON+ " TEXT," 
+ MonDBAdapter.LOCATION+ " TEXT," 
+ MonDBAdapter.TUTOR+ " TEXT," 
+ MonDBAdapter.NOTES+ " TEXT" + ");"; 


private final Context context; 
private DatabaseHelper DBHelper; 
private SQLiteDatabase db; 


public DBAdapter(Context ctx) 
{ 
    this.context = ctx; 
    this.DBHelper = new DatabaseHelper(this.context); 


} 

private static class DatabaseHelper extends SQLiteOpenHelper 
{ 
    DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     db.execSQL(MONDAY); 
     db.execSQL(TUESDAY); 
     db.execSQL(WEDNESDAY); 
     db.execSQL(THURSDAY); 
     db.execSQL(FRIDAY); 




    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, 
    int newVersion) 
    {    

    } 
} 


public DBAdapter open() throws SQLException 
{ 


    this.db = this.DBHelper.getWritableDatabase(); 
    return this; 
} 


public void close() 
{ 
    this.DBHelper.close(); 
} 
} 


public class MonDBAdapter { 
public static final String ROW_ID = "_id"; 
public static final String LESSON = "name"; 
public static final String LOCATION = "model"; 
public static final String TUTOR = "year"; 
public static final String NOTES = "notes"; 

private static final String MONDAY= "monday"; 

private DatabaseHelper mDbHelper; 
private SQLiteDatabase mDb; 

private final Context mCtx; 

private static class DatabaseHelper extends SQLiteOpenHelper { 

    DatabaseHelper(Context context) { 
     super(context, DBAdapter.DATABASE_NAME, null, DBAdapter.DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 
} 


public MonDBAdapter(Context ctx) { 
    this.mCtx = ctx; 
} 


public MonDBAdapter open() throws SQLException { 
    this.mDbHelper = new DatabaseHelper(this.mCtx); 
    this.mDb = this.mDbHelper.getWritableDatabase(); 
    return this; 
} 


public void close() { 
    this.mDbHelper.close(); 
} 


public long createEntry(String lesson, String location, String tutor , String notes){ 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(LESSON, lesson); 
    initialValues.put(LOCATION, location); 
    initialValues.put(TUTOR, tutor); 
    initialValues.put(NOTES, notes); 
    return this.mDb.insert(MONDAY, null, initialValues); 
} 


public boolean deleteEntry(long rowId) { 

    return this.mDb.delete(MONDAY, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$ 
} 


public Cursor getAllEntries() { 

    return this.mDb.query(MONDAY, new String[] { ROW_ID, 
      LESSON, LOCATION, TUTOR, NOTES }, null, null, null, null, null); 
} 


public Cursor getEntry(long rowId) throws SQLException { 

    Cursor mCursor = 

    this.mDb.query(true, MONDAY, new String[] { ROW_ID, LESSON, 
      LOCATION, TUTOR, NOTES}, ROW_ID + "=" + rowId, null, null, null, null, null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

public boolean updateEntry(long rowId, String lesson, String location, 
     String tutor, String notes){ 
    ContentValues args = new ContentValues(); 
    args.put(LESSON, lesson); 
    args.put(LOCATION, location); 
    args.put(TUTOR, tutor); 
    args.put(NOTES, notes); 
    return this.mDb.update(MONDAY, args, ROW_ID + "=" + rowId, null) >0; 
} 

私はlogcatになって何が:

ERROR/AndroidRuntime(2464): FATAL EXCEPTION: main 
ERROR/AndroidRuntime(2464): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.scotty65/com.scotty65.TabBarExample}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.scotty65/com.scotty65.Monday}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
ERROR/AndroidRuntime(2464):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768) 
ERROR/AndroidRuntime(2464):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784) 
ERROR/AndroidRuntime(2464):  at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
ERROR/AndroidRuntime(2464):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
ERROR/AndroidRuntime(2464):  at android.os.Handler.dispatchMessage(Handler.java:99) 
ERROR/AndroidRuntime(2464):  at android.os.Looper.loop(Looper.java:123) 
ERROR/AndroidRuntime(2464):  at android.app.ActivityThread.main(ActivityThread.java:3835) 
ERROR/AndroidRuntime(2464):  at java.lang.reflect.Method.invokeNative(Native Method) 
ERROR/AndroidRuntime(2464):  at java.lang.reflect.Method.invoke(Method.java:507) 
ERROR/AndroidRuntime(2464):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
ERROR/AndroidRuntime(2464):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
/AndroidRuntime(2464):  at dalvik.system.NativeStart.main(Native Method) 
ERROR/AndroidRuntime(2464): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.scotty65/com.scotty65.Monday}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
ERROR/AndroidRuntime(2464):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768) 
ERROR/AndroidRuntime(2464):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:1598) 
ERROR/AndroidRuntime(2464):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
ERROR/AndroidRuntime(2464):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
+0

どのラインが例外を投げていますか? – Cristian

答えて

0

あなたがgetReadableDatabaseの文書を通じて得た場合には、それは

同様getWritableDatabaseは()、このメソッドが返すまでに長い時間がかかることがありますと言うので、あなたがからを含め、アプリケーションのメインスレッドから呼び出すべきではありませんContentProvider.onCreate()

そして、私は最初のあなたが

this.DBHelper = new DatabaseHelper(this.context); 
this.DBHelper.getWritableDatabase(); 
this.DBHelper.getReadableDatabase(); 
DBAdapter

のコンストラクタでこれを呼び出している、あなたのプログラムで参照を

を呼び出し、次にonCreateでdb.open()を呼び出しています。ここでもう一度thisを呼び出します.DBHelper.getWritableDatabase();

あなたのデータベースが正しく読み込まれていない可能性があります。そして、このすべての操作をバックグラウンドスレッドex AsyncTaskで実行しようとします。

願っています!

+0

返信ありがとうございましたthis.DBHelper.getWritableDatabase();を削除しました。 this.DBHelper.getReadableDatabase();彼らはオープンメソッドでも呼ばれています。私はあなたが言ったことを試みます。ありがとうございました – mvdonald46

+0

私はAsyncTaskに慣れていません。私はAndroid開発にかなり新しいです。そこで、アプリケーションを起動するときに呼び出される別のアクティビティを作成するためのnoobルートを作成しました。このアクティビティは、データベースを開いてロードする時間を与えます。私は月曜日クラスが開始されたときにMonday.classを実行するという意図を引き起こすボタンを使用しますが、強制的に強制終了します。 確かにロードする時間がないなら、これはうまくいくでしょう。何か案は? – mvdonald46

+0

@mvdonald私はあなたに私のオープンソースプロジェクトFeedReaderのリンクを提供しています。 FeedDBクラスはデータベースの作成を行います。ここには[link](https://github.com/gopalB/FeedReader/blob/master/src/com/feedReader/provider/FeedDB.java)があり、73行目の[FeedActivity ](https://github.com/gopalB/FeedReader/blob/master/src/com/feedReader/FeedActivity.java)では、AsyncTaskを使用してデータベースを開き、データベースを照会する方法を確認します。 – Gopal

0

私はwherが表示されません実際には、データベースを閉じるときにclose()関数を呼び出して終了します。あなたのセクションを追加した後、それを閉じようとするかもしれません。私はあなたがそれを閉じるための方法を提供していますが、実際にそれらを使用したようには見えません。ドキュメントから

正常に開かれると、あなたはデータベースに書き込む必要があるたびに、このメソッドを呼び出すことができるように、データベースは、キャッシュされています。 (データベースが不要になったときにclose()を呼び出すようにしてください)。不正なアクセス権やディスクがいっぱいの場合、このメソッドは失敗する可能性がありますが、 データベースのアップグレードに時間がかかる場合があります。ContentProvider.onCreate()など、アプリケーションのメインスレッドからこのメソッドを呼び出さないでください。

関連する問題