2011-02-11 20 views
21

जब भी मैं अपना ऐप शुरू करता हूं, मुझे अपने लॉगकैट में java.lang.IllegalArgumentException: column '_id' does not exist त्रुटि मिलती है। मैंने कॉलम '_id' बनाया है, लेकिन यह अभी भी इसे फेंकता है।ऐप क्रैश पर java.lang.IllegalArgumentException: कॉलम '_id' मौजूद नहीं है

package com.gantt.shoppinglist; 

import android.app.Dialog; 
import android.app.ListActivity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public class ShoppingList extends ListActivity { 

    private DataHelper DataHelper; 
    /** Called when the activity is first created. */ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     DataHelper = new DataHelper(this); 

     Cursor c = (Cursor) DataHelper.selectAll(); 
     long id = c.getLong(c.getColumnIndex("_id")); 
     startManagingCursor(c); 

     ListView lv = (ListView) findViewById(android.R.id.list); 

     String[] from = new String[] { com.gantt.shoppinglist.DataHelper.getDatabaseName() }; 
     int[] to = new int[] { android.R.id.text1 }; 

     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
       android.R.layout.simple_list_item_1, c, from, to);  
     lv.setAdapter(adapter); 

     Button button1main = (Button) findViewById(R.id.add); 
     button1main.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      final Dialog additem = new Dialog(ShoppingList.this); 
      additem.setContentView(R.layout.maindialog); 
      final EditText et = (EditText)additem.findViewById(R.id.edittext); 
      additem.setTitle("Type your item"); 
      additem.setCancelable(true); 
      et.setHint("Type the name of an item..."); 

      Button button = (Button) additem.findViewById(R.id.cancel); 
      button.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        additem.dismiss(); 
       } 
      }); 
      additem.show(); 

      Button ok = (Button) additem.findViewById(R.id.ok); 
      ok.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        final String text = et.getText().toString(); 
        additem.dismiss(); 
        et.setText(""); 
       } 
      }); 
     } 
     }); 
    } 
} 

यहाँ मेरी DataHelper वर्ग है:: यहाँ अपने मुख्य जावा है

package com.gantt.shoppinglist; 

import java.util.ArrayList; 
import java.util.List; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteStatement; 
import android.util.Log; 

public class DataHelper { 

     private static final String DATABASE_NAME = "items.db"; 
     private static final int DATABASE_VERSION = 1; 
     private static final String TABLE_NAME = "table1"; 
     public static final String KEY_ROWID = "_id"; 

     private Context context; 
     private SQLiteDatabase db; 

     private SQLiteStatement insertStmt; 
     private static final String INSERT = "insert into " 
      + TABLE_NAME + "(name) values (?)"; 

     public DataHelper(Context context) { 
      this.context = context; 
      OpenHelper openHelper = new OpenHelper(this.context); 
      this.db = openHelper.getWritableDatabase(); 
      this.insertStmt = this.db.compileStatement(INSERT); 
     } 

     public long insert(String name) { 
      this.insertStmt.bindString(1, name); 
      return this.insertStmt.executeInsert(); 
     } 

     public void deleteAll() { 
      this.db.delete(TABLE_NAME, null, null); 
     } 

     public Cursor selectAll() { 
      List<String> list = new ArrayList<String>(); 
      Cursor cursor = this.db.query(TABLE_NAME, new String[] { "name" }, 
      null, null, null, null, "name desc"); 
      if (cursor.moveToFirst()) { 
      do { 
       list.add(cursor.getString(0)); 
      } while (cursor.moveToNext()); 
      } 
      if (cursor != null && !cursor.isClosed()) { 
      cursor.close(); 
      } 
      return cursor; 
     } 

     public static String getDatabaseName() { 
     return DATABASE_NAME; 
    } 

    private static class OpenHelper extends SQLiteOpenHelper { 

      OpenHelper(Context context) { 
      super(context, getDatabaseName(), null, DATABASE_VERSION); 
      } 

      @Override 
      public void onCreate(SQLiteDatabase db) { 
       db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT"); 

      } 

      @Override 
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w("Example", "Upgrading database, this will drop tables and recreate."); 
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
      onCreate(db); 
      } 
     } 
    } 
+0

आप अनुप्रयोग की स्थापना रद्द करने और इतना है कि यह फिर से स्थापित यह सुनिश्चित कर लें कि आपकी डेटाबेस नव निर्मित _ id स्तंभ है? या शायद इसे अपग्रेड विधि पर शामिल करें? – binnyb

उत्तर

50

मैं ने वही समस्या थी - मुझे लगता है कि यह ('के रूप में' चुनें या) 'का चयन करें' कुछ _id कहा जाता है क्योंकि SimpleCursorAdapter यह जरूरत के लिए होने का एक मामला है।

documentation से:

हैंडलिंग सामग्री यूआरआई आईडी

परंपरा के मुताबिक, प्रदाताओं को एक तालिका में एक ही पंक्ति के लिए उपयोग द्वारा पंक्ति के लिए एक आईडी मूल्य के साथ एक सामग्री यूआरआई को स्वीकार करने की पेशकश यूआरआई के अंत में। सम्मेलन के अनुसार, प्रदाता आईडी के मान को तालिका के _ID कॉलम से मेल खाते हैं, और मिलान की पंक्ति के विरुद्ध अनुरोधित पहुंच निष्पादित करते हैं।

यह सम्मेलन एक प्रदाता तक पहुंचने वाले ऐप्स के लिए एक सामान्य डिज़ाइन पैटर्न की सुविधा प्रदान करता है। ऐप प्रदाता के खिलाफ एक प्रश्न करता है और का उपयोग कर ListView में Cursor परिणामस्वरूप प्रदर्शित करता है। CursorAdapter की परिभाषा Cursor में _ID होने के लिए कॉलम में से एक की आवश्यकता है।

मेरे मामले में, मैं अपनी तालिका में एक autonumber स्तंभ 'OID' कहा जाता है इसलिए मैं अपने चयन आदेश बदल (उदाहरण के लिए) होने के लिए है ...

SELECT oid as _id, name, number FROM mytable 

यह मेरे लिए समस्या ठीक हो ।

संपादित करें और अधिक व्यापक कोड को दिखाने के लिए ...

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.channel_selector); 

    GridView channel_selector_grid = (GridView) findViewById(R.id.channel_grid); 
    sca = getGuideAdapter(); 
    channel_selector_grid.setAdapter(sca); 
} 

public SimpleCursorAdapter getGuideAdapter() { 
    SimpleCursorAdapter adapter = null; 
    SQLiteDatabase db = SQLiteDatabaseHelper.getReadableDatabase(); 
    Cursor cursor = db.rawQuery("SELECT DISTINCT oid as _id, name, number FROM CHAN_TABLE ORDER BY number", null); 
    if (cursor.moveToFirst()) { 
     String[] columnNames = { "name" }; 
     int[] resIds = { R.id.channel_name }; 
     adapter = new SimpleCursorAdapter(this, R.layout.channel_selector_item, cursor, columnNames, resIds); 
    } 
    return adapter; 
} 
+1

इसी प्रकार, यदि प्रबंधितQuery का उपयोग करना है तो इसमें स्ट्रिंग [] सरणी दूसरे तर्क में "_id" होना चाहिए। – NoBugs

+0

स्पॉट ऑन! मुझे CallLogs के साथ एक ही त्रुटि हो रही थी और फ़ील्ड में android.provider.CallLog.Calls._ID को जोड़ना पड़ा! काम किया। – SarjanWebDev

+0

@Squonk यूआईडी के लिए उपयोग किए गए एडाप्टर कॉलम को बदलने का कोई तरीका है? – StErMi

1

उम यकीन नहीं करता है, तो आप सिर्फ गलत में यह पेस्ट किया है किंतु:

DataHelper = new DataHelper(this); 
Cursor c = (Cursor) DataHelper.selectAll(); 

गलत है ।

DataHelper dataHelper = new DataHelper(this); 
Cursor c = (Cursor) dataHelper.selectAll(); 

हे बुरा तुम सिर्फ एक अपरकेस डी के साथ अपने चर नाम घोषित कर दिया है, यह सिफारिश की है और न ही नहीं है मानक जावा कोडिंग: आप किसी ऑब्जेक्ट को यह घोषणा करते हैं और initialised डेटाबेस ऑब्जेक्ट पर अपने तरीकों कॉल करने की आवश्यकता अंदाज।

http://java.about.com/od/javasyntax/a/nameconventions.htm

+0

ओह! ठीक है, मैं कोशिश करूँगा – Cg2916

संबंधित मुद्दे