2013-07-05 26 views
0

我想存储我的JSON数据在数据库中,然后我想在我的活动列表视图中显示,但它一次又一次地显示这些相同的错误,即使我检查了很多方法。JSON到DB创建错误logcat列'ID'不存在

我发送的ID,标题,内容,计数的JSON数据,但我只显示标题,内容和数量。它显示列“_id”不存在。

Ginfydbadapter.java

public class GinfyDbAdapter { 

    private static final String DATABASE_NAME = "ginfy.db"; 
    private static final String DATABASE_TABLE_PROJ = "prayers"; 
    private static final int DATABASE_VERSION = 3; 
    public static final String CATEGORY_COLUMN_ID = "_id"; 
    public static final String CATEGORY_COLUMN_TITLE = "title"; 
    public static final String CATEGORY_COLUMN_CONTENT = "content"; 
    public static final String CATEGORY_COLUMN_COUNT = "count"; 


    private static final String TAG = "GinfyDbAdapter"; 
    private DatabaseHelper mDbHelper; 
    private static SQLiteDatabase mDb; 
    private final Context mCtx; 





    public void saveCategoryRecord(String id, String title, String content, String count) { 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(CATEGORY_COLUMN_ID, id); 
     contentValues.put(CATEGORY_COLUMN_TITLE, title); 
     contentValues.put(CATEGORY_COLUMN_CONTENT, content); 
     contentValues.put(CATEGORY_COLUMN_COUNT, count); 
     mDb.insert(DATABASE_NAME, null, contentValues); 
     } 
    public Cursor getTimeRecordList() { 
     return mDb.rawQuery("select * from " + DATABASE_NAME, null); 
     } 
    private static class DatabaseHelper extends SQLiteOpenHelper { 

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



     private static final String DATABASE_CREATE_PROJ = 
       "create table " + DATABASE_TABLE_PROJ + " (" 
       + CATEGORY_COLUMN_ID + " integer primary key , " 
       + CATEGORY_COLUMN_TITLE + " text not null, " + CATEGORY_COLUMN_CONTENT + " text not null, " + CATEGORY_COLUMN_COUNT + " integer);" ; 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     String DATABASE_CREATE_PROJ = "CREATE TABLE " + DATABASE_TABLE_PROJ + "(" 
       + CATEGORY_COLUMN_ID + " INTEGER PRIMARY KEY, " 
       + CATEGORY_COLUMN_TITLE + " TEXT, " + CATEGORY_COLUMN_CONTENT + " TEXT, " + CATEGORY_COLUMN_COUNT + " INTEGER );" ; 
       db.execSQL(DATABASE_CREATE_PROJ);  
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS"+ DATABASE_NAME); 
     onCreate(db); 
    } 


} 

    public void saveCategoryRecord(Category category) { 

     String query = "insert into"+ DATABASE_NAME+ " values(?, ?, ?, ?, ?, ?)"; 
     SQLiteStatement stmt = mDb.compileStatement(query); 
     stmt.bindString(1, category.getId()); 
     stmt.bindString(2, category.getTitle()); 
     stmt.bindString(3, category.getContent()); 
     stmt.bindString(4, category.getCount()); 
     stmt.execute(); 
    } 

    public Cursor fetchAllProjects() { 
     // TODO Auto-generated method stub 
     return mDb.query(DATABASE_TABLE_PROJ, new String[] {CATEGORY_COLUMN_TITLE, CATEGORY_COLUMN_CONTENT, CATEGORY_COLUMN_COUNT }, null, null, null, null, null); 
    } 

    public GinfyDbAdapter(Context ctx) { 
     this.mCtx = ctx; 

    } 

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


} 

Mymainactivity.java

public class MainActivity extends Activity implements FetchDataListener,OnClickListener{ 
    private static final int ACTIVITY_CREATE=0; 
    private static final int TAG_CATEGORY = 0; 
    private static final String CATEGORY_COLUMN_ID = "_id"; 
    private static final String CATEGORY_COLUMN_TITLE = "title"; 
    private static final String CATEGORY_COLUMN_CONTENT = "content"; 
    private static final String CATEGORY_COLUMN_COUNT = "count"; 
    private static final int Application = 0; 
    private ProgressDialog dialog; 
    ListView lv; 
    ListView lv1; 
    private List<Application> items; 
    private Button btnGetSelected; 
    private Button praycount; 
    public int pct; 
    private String stringVal; 
    private TextView value; 
    private int prayers; 
    private int prayerid; 
    EditText myFilter; 
    ApplicationAdapter adapter; 
    private GinfyDbAdapter mDbHelper; 
    JSONArray contacts = null; 
     private SimpleCursorAdapter dataAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list_item); 
     mDbHelper=new GinfyDbAdapter(MainActivity.this); 
     mDbHelper.open(); 
     fillData(); 
     registerForContextMenu(getListView()); 
     //mDbHelper.saveCategoryRecord(new Category(id,title,content,count)); 

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



     btnGetSelected = (Button) findViewById(R.id.btnget); 
     btnGetSelected.setOnClickListener(this); 

     myFilter = (EditText) findViewById(R.id.myFilter); 


     // Adding items to listview 


     /** 
     * Enabling Search Filter 
     * */ 




     new GetDataAsyncTask().execute(); 
     //praycount.setOnClickListener(this); 
     //initView(); 
    } 

    private View getListView() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    /*private void initView(){ 
     // show progress dialog 
     dialog = ProgressDialog.show(this, "", "Loading..."); 
     String url = "http://www.ginfy.com/api/v1/posts.json"; 
     FetchDataTask task = new FetchDataTask(this); 
     task.execute(url); 


    } */ 

    private class GetDataAsyncTask extends AsyncTask<Void, Void, Boolean> { 
     private ProgressDialog Dialog = new ProgressDialog(MainActivity.this); 

     protected void onPreExecute() { 
      Dialog.setMessage("Loading....."); 
      Dialog.show(); 
     } 
     @Override 
     protected void onPostExecute(Boolean result) { 
      super.onPostExecute(result); 
      Dialog.dismiss(); 
      Intent intent = new Intent(MainActivity.this, MainActivity.class); 
      startActivity(intent); 
     } 
     @Override 
     protected Boolean doInBackground(Void... params) { 
      getProdData(); 
      return null; 
     } 
    } 

    public void getProdData() { 
     // getting JSON string from URL 
     JSONParser jsonObject = new JSONParser(); 
     //JSONObject jsonObject = new JSONObject(); 
      //JSONArray aJson = jsonObject.getJSONArray("post"); 
      String url = "http://www.ginfy.com/api/v1/posts.json"; 
      // getting JSON string from URL 
      //JSONArray aJson = jsonObject.getJSONArray(url); 
      JSONArray Json = jsonObject.getJSONFromUrl(url); 

      try { 
       // Getting Array of Contacts 
       contacts = Json.getJSONArray(TAG_CATEGORY); 

       // looping through All Contacts 
       for(int i = 0; i < contacts.length(); i++){ 
        JSONObject c = contacts.getJSONObject(i); 

        // Storing each json item in variable 
        String id = c.getString(CATEGORY_COLUMN_ID); 
        String title = c.getString(CATEGORY_COLUMN_TITLE); 
        String content = c.getString(CATEGORY_COLUMN_CONTENT); 
        String count = c.getString(CATEGORY_COLUMN_COUNT); 

        mDbHelper.saveCategoryRecord(new Category(id,title,content,count)); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

    @SuppressLint("NewApi") 
    @SuppressWarnings("deprecation") 
    private void fillData() { 
     mDbHelper.open(); 
     Cursor projectsCursor = mDbHelper.fetchAllProjects(); 
     //startManagingCursor(projectsCursor); 

     // Create an array to specify the fields we want to display in the list (only TITLE) 
     String[] from = new String[]{GinfyDbAdapter.CATEGORY_COLUMN_TITLE, GinfyDbAdapter.CATEGORY_COLUMN_CONTENT, GinfyDbAdapter.CATEGORY_COLUMN_COUNT}; 

     // and an array of the fields we want to bind those fields to (in this case just text1) 
     int[] to = new int[]{R.id.text2, R.id.text1, R.id.count}; 

     /* Now create a simple cursor adapter and set it to display 
     SimpleCursorAdapter projects = 
       new SimpleCursorAdapter(this, R.layout.activity_row, projectsCursor, from, to); 
     setListAdapter(projects); 
     */ 
     // create the adapter using the cursor pointing to the desired data 
     //as well as the layout information 
     dataAdapter = new SimpleCursorAdapter(
      this, R.layout.activity_row, 
      projectsCursor, 
      from, 
      to, 
      0); 
     setListAdapter(dataAdapter); 




    } 



    private void setListAdapter(SimpleCursorAdapter dataAdapter2) { 
     // TODO Auto-generated method stub 

    } 

Logcaterror COLUMN_ID示出了多年平均值存在

07-05 07:05:56.874: E/AndroidRuntime(8803): FATAL EXCEPTION: main 
07-05 07:05:56.874: E/AndroidRuntime(8803): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.jsonandroid/com.example.jsonandroid.MainActivity}: java.lang.IllegalArgumentException: column '_id' does not exist 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.os.Looper.loop(Looper.java:137) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at dalvik.system.NativeStart.main(Native Method) 
07-05 07:05:56.874: E/AndroidRuntime(8803): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.widget.CursorAdapter.init(CursorAdapter.java:168) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.widget.CursorAdapter.<init>(CursorAdapter.java:145) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:91) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:104) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at com.example.jsonandroid.MainActivity.fillData(MainActivity.java:189) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at com.example.jsonandroid.MainActivity.onCreate(MainActivity.java:67) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.app.Activity.performCreate(Activity.java:5104) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
07-05 07:05:56.874: E/AndroidRuntime(8803):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
+0

你在最初创建与其他列的表中添加_id? –

回答

1

更改下列行:

return mDb.query(DATABASE_TABLE_PROJ, new String[] {CATEGORY_COLUMN_TITLE, CATEGORY_COLUMN_CONTENT, CATEGORY_COLUMN_COUNT }, null, null, null, null, null); 

到:

return mDb.query(DATABASE_TABLE_PROJ, new String[] {CATEGORY_COLUMN_ID, CATEGORY_COLUMN_TITLE, CATEGORY_COLUMN_CONTENT, CATEGORY_COLUMN_COUNT }, null, null, null, null, null); 
+0

eventhough它显示同样的错误,像这样07-05 07:11:41.415:E/AndroidRuntime(10009):java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.jsonandroid/com.example.jsonandroid.MainActivity} :java.lang.IllegalArgumentException:列'_id'不存在 –

+0

只需在fetchAllProjects()中确保您的游标包含字段_id – pskink

1

虽然将数据插入到数据库,你应该指定表名,而不是数据库名称。因此,改变

mDb.insert(DATABASE_NAME, null, contentValues); 

mDb.insert(DATABASE_TABLE_PROJ , null, contentValues); 

同样更改查询return mDb.rawQuery("select * from " + DATABASE_TABLE_PROJ, null);

更正从您创建语句的末尾部分:

+ CATEGORY_COLUMN_COUNT + " INTEGER );" ; 

+ CATEGORY_COLUMN_COUNT + " INTEGER )" ; 

上升级到db.execSQL("DROP TABLE IF EXISTS"+ DATABASE_TABLE_PROJ);

正确同样改变saveCategoryRecord有表名,而不是DBNAME