0

我想将我的 json 数据存储在数据库中,然后我想在我的活动的列表视图中显示,但它一次又一次地显示这些相同的错误,即使我检查了很多方法。

我正在发送 id、title、content、count 的 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;
        }


}

我的mainactivity.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)
4

2 回答 2

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);
于 2013-07-05T07:29:49.100 回答
1

在将数据插入 db 时,您应该指定 tablename 而不是 db name。所以改变

mDb.insert(DATABASE_NAME, null, contentValues);

mDb.insert(DATABASE_TABLE_PROJ , null, contentValues);

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

更正 Create 语句的结尾部分:

+ CATEGORY_COLUMN_COUNT + " INTEGER   );" ;

+ CATEGORY_COLUMN_COUNT + " INTEGER   )" ;

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

同样将 saveCategoryRecord 更改为具有 tablename 而不是 dbname

于 2013-07-06T14:07:31.663 回答