2013-12-15 2 views
6

У меня проблема при использовании базы данных. Когда я запускаю свой SQLView.java, я получаю фатальное исключение:Не удалось прочитать строку 0, col -1 из CursorWindow?

java.lang.RuntimeException: Unable to start activity  ComponentInfo{com.jacob.eindproject/com.jacob.eindproject.SQLView}:  java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure  the Cursor is initialized correctly before accessing data from it. 

Надеюсь, кто-то может мне помочь. Я отправлю все свои коды, связанные с базой данных. Скажите, пожалуйста, когда вам нужно что-то еще, и не стесняйтесь спрашивать больше информации!

Я думаю, что что-то не так с моими столбцами, не могу понять, что.

Кроме того, я прочитал ВСЕ связанные вопросы на этом веб-сайте, но я не могу узнать, где я должен объявить свои столбцы и что добавить/изменить. Кто-нибудь знает, как это сделать? :)

Для начала: мой класс базы данных:

package com.jacob.eindproject; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 

import java.sql.*; 

public class Database { 

    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_NAME = "persons_name"; 
    public static final String KEY_HOTNESS = "persons_hotness"; 

    private static final String DATABASE_NAME = "Databasedb"; 
    private static final String DATABASE_TABLE = "peopleTable"; 
    private static final int DATABASE_VERSION = 1; 

    private DbHelper ourHelper; 
    private final Context ourContext; 
    private SQLiteDatabase ourDatabase; 

    private static class DbHelper extends SQLiteOpenHelper{ 

     public DbHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      // TODO Auto-generated constructor stub 
     } 

     @Override //I create it here, right? 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
        KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
        KEY_NAME + " TEXT NOT NULL, " + 
        KEY_HOTNESS + " TEXT NOT NULL);"      
     ); 


     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
      onCreate(db); 
     } 

     public void close(Database database) { 
      // TODO Auto-generated method stub 

     } 
    } 



    public Database(Context c){ 
     ourContext = c; 
    } 

    public Database open() throws SQLException{ 
     ourHelper = new DbHelper(ourContext); 
     ourDatabase = ourHelper.getWritableDatabase(); 
     return this;   
    } 

    public void close() { 

    ourHelper.close(); 
} 



    public long createEntry(String name, String hotness) { 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_NAME, name); 
     cv.put(KEY_HOTNESS, hotness); 
     return ourDatabase.insert(DATABASE_TABLE, null, cv); 

    } 

    public String getData() { 
     // TODO Auto-generated method stub 
     String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
     String result = ""; 

     int iRow = c.getColumnIndex(KEY_ROWID); 
     int iName = c.getColumnIndex(DATABASE_NAME); 
     int iHotness = c.getColumnIndex(KEY_HOTNESS); 

     for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
      result = result + c.getString(iRow) + " " + c.getString(iName) + " " + c.getString(iHotness) + "\n"; 


     } 

     return result; 
    } 
} 

В SQLite класс, чтобы зафиксировать ввод:

package com.jacob.eindproject; 

import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.app.Activity; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.view.View.OnClickListener; 


public class SQLite extends Activity implements View.OnClickListener { 

    Button sqlUpdate, sqlView; 
    EditText sqlName, sqlHotness; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sqllite); 
     sqlUpdate = (Button) findViewById(R.id.bSQLUpdate); 
     sqlName = (EditText) findViewById(R.id.etSQLName); 
     sqlHotness = (EditText) findViewById(R.id.etSQLHotness); 

     sqlView = (Button) findViewById(R.id.bSQLopenView); 
     sqlView.setOnClickListener((android.view.View.OnClickListener) this); 
     sqlUpdate.setOnClickListener((android.view.View.OnClickListener) this); 
    } 

    public void onClick(View arg0) { 
     switch (arg0.getId()) { 
     case R.id.bSQLUpdate: 


      boolean didItWork = true; 
      try{    
      String name = sqlName.getText().toString(); 
      String hotness = sqlHotness.getText().toString(); 

      Database entry = new Database(SQLite.this); 
      entry.open(); 
      entry.createEntry(name, hotness); 
      entry.close(); 

      }catch (Exception e){ 
       didItWork = false; 

      }finally{ 
       if (didItWork){ 
        Dialog d = new Dialog(this); 
        d.setTitle("Heak Yeay"); 
        TextView tv = new TextView(this); 
        tv.setText("Succes"); 
        d.setContentView(tv); 
        d.show(); 
      } 
     } 

      break; 
     case R.id.bSQLopenView: 
      Intent i = new Intent("com.jacob.eindproject.SQLVIEW"); 
      startActivity(i); 


     } 
     } 

    public void onClick(DialogInterface arg0, int arg1) { 
     // TODO Auto-generated method stub 

    } 

    } 

После этого, мой класс SQLView, чтобы посмотреть вход с SQLite класс:

package com.jacob.eindproject; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class SQLView extends Activity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sqlview); 
     TextView tv = (TextView) findViewById(R.id.tvSQLinfo); 
     Database info = new Database(this); 
     info.open(); 
     String data = info.getData(); 
     info.close(); 
     tv.setText(data); 





    } 

} 

Теперь мои файлы XML:

SQLView.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 


    <TableLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tableLayout1"> 

     <TableRow> 

       <TextView android:text="@string/Names" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"/> 

       <TextView android:text="@string/Hotness" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> 

     </TableRow> 


    </TableLayout> 

     <TextView android:id="@+id/tvSQLinfo" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="@string/info"/> 

</LinearLayout> 

sqllite.xml:

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 


    <TextView 
     android:id="@+id/Naam" 
     android:text="@string/Naam" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

    <EditText 
     android:id="@+id/etSQLName" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
    </EditText> 

    <TextView 
     android:id="@+id/hotness" 
     android:text="@string/hotnessscale" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
    /> 

    <EditText 
     android:id="@+id/etSQLHotness" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
    </EditText>  

    <Button 
     android:id="@+id/bSQLUpdate" 
     android:text="@string/Update" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" ></Button> 



    <Button 
     android:id="@+id/bSQLopenView" 
     android:text="@string/View" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"  
    ></Button>  

</LinearLayout> 

Класс, меню, чтобы установить меню, с OnListItemClick (есть некоторые другие виды деятельности, в там, такие как Overgewicht. Не против них, я думаю ..):

package com.jacob.eindproject; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class Menu extends ListActivity implements OnItemClickListener { 


    String classes[] = { "BMI- Calculator", "Ondergewicht", "Gezond Gewicht", "Overgewicht", "Database", "Bekijk Database"}; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setListAdapter(new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, classes)); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    //Positie 0 is het eerste item (dus de BMI-Calculator.) 
    super.onListItemClick(l, v, position, id); 

    switch(position) 
    { 
    case 0: 
    Intent openStartingPoint = new Intent(getApplicationContext(),MainActivity.class); 
    startActivity(openStartingPoint); 
    break; 

    case 1: 
    Intent openOndergewicht = new Intent(getApplicationContext(),Ondergewicht.class); 
    startActivity(openOndergewicht); 
    break; 

    case 2: 
    Intent openGezondgewicht = new Intent(getApplicationContext(),Gezond_gewicht.class); 
    startActivity(openGezondgewicht); 
    break; 

    case 3: 
    Intent openOvergewicht = new Intent(getApplicationContext(),Overgewicht.class); 
    startActivity(openOvergewicht); 

    break; 


    case 4: 
    Intent openDatabase = new Intent(getApplicationContext(),SQLite.class); 
    startActivity(openDatabase);  

    break; 

    case 5: 
    Intent openViewdatabase = new Intent(getApplicationContext(),SQLView.class); 
    startActivity(openViewdatabase);  

    break; 

    } 


    } 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 

    } 
} 

Мой Android файл манифеста: (опять же, я объявил некоторые другие вещи, не против них)

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.jacob.eindproject" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="18" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 


     <activity 
      android:name="com.jacob.eindproject.Menu" 
      android:label="@string/app_name" > 
     </activity> 

     <activity 
      android:name="com.jacob.eindproject.Inleiding" 
      android:label="@string/app_name" > 
        <intent-filter> 
          <action android:name="android.intent.action.MAIN" /> 
          <category android:name="android.intent.category.LAUNCHER" /> 
        </intent-filter> 
     </activity> 

     <activity 
      android:name="com.jacob.eindproject.MainActivity" 
      android:label="@string/app_name" > 
        <intent-filter> 
          <action android:name="android.intent.action.MAIN" /> 
          <category android:name="android.intent.category.DEFAULT" /> 
        </intent-filter> 
     </activity>   

     <activity 
      android:name="com.jacob.eindproject.Ondergewicht" 
      android:label="@string/app_name" > 
     </activity>   

     <activity 
      android:name="com.jacob.eindproject.Gezond_gewicht" 
      android:label="@string/app_name" > 
     </activity> 

     <activity 
      android:name="com.jacob.eindproject.Overgewicht" 
      android:label="@string/app_name" > 
     </activity> 

     <activity 
      android:name="com.jacob.eindproject.Database" 
      android:label="@string/app_name" > 
        <intent-filter> 
          <action android:name="com.jacob.eindproject.DATABASE" /> 
          <category android:name="android.intent.category.DEFAULT" /> 
        </intent-filter> 
     </activity>     

     <activity 
      android:name=".SQLView" 
      android:label="@string/app_name" > 
        <intent-filter> 
          <action android:name="com.jacob.eindproject.SQLVIEW" /> 
          <category android:name="android.intent.category.DEFAULT" /> 
        </intent-filter>      

     </activity>   


     <activity 
      android:name="com.jacob.eindproject.SQLite" 
      android:label="@string/app_name" > 
        <intent-filter> 
          <action android:name="com.jacob.eindproject.SQLITE" /> 
          <category android:name="android.intent.category.DEFAULT" /> 
        </intent-filter> 
     </activity> 



    </application> 

</manifest> 

в конце концов, мой LogCat, чтобы показать вам ошибку:

12-14 11:04:18.227: E/AndroidRuntime(1577): FATAL EXCEPTION: main 
12-14 11:04:18.227: E/AndroidRuntime(1577): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jacob.eindproject/com.jacob.eindproject.SQLView}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.os.Looper.loop(Looper.java:137) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at java.lang.reflect.Method.invoke(Method.java:525) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at dalvik.system.NativeStart.main(Native Method) 
12-14 11:04:18.227: E/AndroidRuntime(1577): 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. 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.database.CursorWindow.nativeGetString(Native Method) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.database.CursorWindow.getString(CursorWindow.java:434) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at com.jacob.eindproject.Database.getData(Database.java:95) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at com.jacob.eindproject.SQLView.onCreate(SQLView.java:16) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.app.Activity.performCreate(Activity.java:5133) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
12-14 11:04:18.227: E/AndroidRuntime(1577):  ... 11 more 

Надеюсь, кто берет время, чтобы помочь мне. Я очень благодарен тем, кто смотрит на это. Спасибо всем заранее.

Jacob

ответ

9
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
String result = ""; 

int iRow = c.getColumnIndex(KEY_ROWID); 
int iName = c.getColumnIndex(DATABASE_NAME); 

Ваш курсор не имеет столбец с именем DATABASE_NAME. Вы, вероятно, имели в виду KEY_NAME для этого вызова getColumnIndex(), который в этих формах возвращает -1 и попытка получить данные с таким индексом приведет к тому, что вы видите.

+0

А? Но я заявляю это здесь, верно? В Database.java, в строке 35 - 40 (см. Edit?). – user3104217

+1

Да, у вас есть * таблица * с именем 'DATABASE_TABLE' и столбец' KEY_NAME'. Курсор запросов имеет три столбца: «KEY_ROWID», «KEY_NAME», «KEY_HOTNESS». Ни один из них не является «DATABASE_NAME», для которого вы пытаетесь получить индекс столбца. – laalto

+0

Хм, но что мне тогда изменить? Должен ли я меняться: int iName = ....(KEY_NAME)? – user3104217

Смежные вопросы