मैं SQLite डेटाबेस पर अपनी प्रतिक्रिया दे रहा हूं और तब तक काम कर रहा था जब तक कि मैंने कर्सर एडाप्टर को सूचीदृश्य में जोड़ना शुरू नहीं किया। अब जब मैं डेटा को सहेजने और इसे खींचने का प्रयास करता हूं तो मुझे java.lang.IllegalArgumentException मिलता है: कॉलम '_id' मौजूद नहीं है। मैं अपनी प्राथमिक कुंजी को एक विशिष्ट प्रतिक्रिया के रूप में रखना चाहता हूं क्योंकि वेब सेवा कॉल एक ही नंबर से जुड़ी हुई हैं। क्या मेरे KEY_ID को कर्मचारी संख्या के रूप में रखने का कोई तरीका है लेकिन _id त्रुटि से छुटकारा पाएं?

मैं चाहता हूं कि कुंजी कर्मचारी संख्या हो ताकि मैं उसे पकड़ सकूं और उस कर्मचारी को कर्सर एडाप्टर से जुड़ी सूची में पॉप्युलेट कर सकूं। इसकी भी आवश्यकता होगी ताकि मैं उन उपयोगकर्ताओं को दूसरी सूची से हटा सकूं जिन्हें मैं पहले के तहत पॉप्युलेट करना चाहता हूं।

मेरा डेटाबेसहैंडलर

public class DatabaseHandler extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "employeeManager";
    private static final String TABLE_EMPLOYEE = "employee";

    //Employee table columns names
    private static final String KEY_ID = "Employee_number";
    private static final String KEY_FIRST_NAME = "First_name";
    private static final String KEY_LAST_NAME = "Last_name";
    private static final String KEY_PHONE_NUMBER_MOBILE = "Phone_mobile";
    private static final String KEY_PHONE_NUMBER_OFFICE = "Phone_office";
    private static final String KEY_PAYROLL_TITLE = "Payroll_title";
    private static final String KEY_HAS_DIRECT_REPORTS = "Has_direct_reports";
    private static final String KEY_EMAIL = "Email";
    private static final String KEY_COST_CENTER = "Cost_center_id";
    private static final String KEY_THUMBNAIL_IMAGE = "ThumbnailData";


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

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_EMPLOYEE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_EMPLOYEE + "("
                + KEY_ID + " STRING PRIMARY KEY,"
                + KEY_FIRST_NAME + " TEXT,"
                + KEY_LAST_NAME + " TEXT,"
                + KEY_PHONE_NUMBER_MOBILE + " TEXT,"
                + KEY_PHONE_NUMBER_OFFICE + " TEXT,"
                + KEY_PAYROLL_TITLE + " TEXT,"
                + KEY_HAS_DIRECT_REPORTS + " TEXT,"
                + KEY_EMAIL + " TEXT,"
                + KEY_THUMBNAIL_IMAGE + " TEXT,"
                + KEY_COST_CENTER + " TEXT" + ")";
        db.execSQL(CREATE_EMPLOYEE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //drop old table if existence
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_EMPLOYEE);

        //Create table again
        onCreate(db);
    }

    //Add new employee
    public boolean addEmployee(Employee employee) {
        SQLiteDatabase database = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_ID, employee.getEmployee_number());
        values.put(KEY_FIRST_NAME, employee.getFirst_name());
        values.put(KEY_LAST_NAME, employee.getLast_name());
        values.put(KEY_PHONE_NUMBER_MOBILE, employee.getPhone_mobile());
        values.put(KEY_PHONE_NUMBER_OFFICE, employee.getPhone_office());
        values.put(KEY_HAS_DIRECT_REPORTS, employee.getHas_direct_reports());
        values.put(KEY_EMAIL, employee.getEmail());
        values.put(KEY_COST_CENTER, employee.getCost_center_id());
        values.put(KEY_PAYROLL_TITLE, employee.getPayroll_title());
        values.put(KEY_THUMBNAIL_IMAGE, employee.getThumbnailData());


        //Inserting Row
        database.insert(TABLE_EMPLOYEE, null, values);
        database.close();
        return true;
    }

    //Get single employee
    public Employee getEmployee(int employeeNumber) {
        SQLiteDatabase database = this.getReadableDatabase();

        Cursor cursor = database.query(TABLE_EMPLOYEE, new String[] {
                KEY_ID, KEY_FIRST_NAME, KEY_LAST_NAME, KEY_PHONE_NUMBER_OFFICE, KEY_PHONE_NUMBER_MOBILE,
                KEY_HAS_DIRECT_REPORTS, KEY_EMAIL, KEY_COST_CENTER, KEY_PAYROLL_TITLE, KEY_THUMBNAIL_IMAGE}, KEY_ID + "=?",
                new String[]{ String.valueOf(employeeNumber)}, null, null, null, null);
        if(cursor != null && cursor.moveToFirst()) {
            return new Employee(cursor.getString(0),
                    cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4),
                    cursor.getString(5), cursor.getString(6), cursor.getString(7), cursor.getString(8),
                    cursor.getString(9), cursor.getString(10), cursor.getString(11), cursor.getString(12),
                    cursor.getString(12), cursor.getString(14), cursor.getString(15), cursor.getString(16),
                    cursor.getString(17), cursor.getString(18), cursor.getString(19), cursor.getString(20),
                    cursor.getString(21), cursor.getString(22), cursor.getString(23), cursor.getString(24),
                    cursor.getString(24), cursor.getString(25), cursor.getString(26));
        }
        return null;
    }

    //Get All Employees
    public ArrayList<Employee> getAllEmployees() {
        ArrayList<Employee> employeeList = new ArrayList<>();
        //Select all query
        String selectQuery = "SELECT * FROM " + TABLE_EMPLOYEE;

        SQLiteDatabase database = this.getWritableDatabase();
        Cursor cursor =  database.rawQuery(selectQuery, null);

        //looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Employee employee = new Employee();
                employee.setEmployee_number(cursor.getString(cursor.getColumnIndex(KEY_ID)));
                employee.setFirst_name(cursor.getString(cursor.getColumnIndex(KEY_FIRST_NAME)));
                employee.setLast_name(cursor.getString(cursor.getColumnIndex(KEY_LAST_NAME)));
                employee.setPhone_office(cursor.getString(cursor.getColumnIndex(KEY_PHONE_NUMBER_MOBILE)));
                employee.setPhone_mobile(cursor.getString(cursor.getColumnIndex(KEY_PHONE_NUMBER_OFFICE)));
                employee.setHas_direct_reports(cursor.getString(cursor.getColumnIndex(KEY_HAS_DIRECT_REPORTS)));
                employee.setEmail(cursor.getString(cursor.getColumnIndex(KEY_EMAIL)));
                employee.setCost_center_id(cursor.getString(cursor.getColumnIndex(KEY_COST_CENTER)));
                employee.setPayroll_title(cursor.getString(cursor.getColumnIndex(KEY_PAYROLL_TITLE)));
                employee.setThumbnailData(cursor.getString(cursor.getColumnIndex(KEY_THUMBNAIL_IMAGE)));
            } while (cursor.moveToNext());
        }

        //return employees list
        return employeeList;
    }

    //Get Employee Count
    public int getEmployeeCount() {
        String countQuery = "SELECT * FROM " + TABLE_EMPLOYEE;
        SQLiteDatabase database = this.getReadableDatabase();
        Cursor cursor = database.rawQuery(countQuery, null);
        cursor.close();

        return cursor.getCount();
    }

    //Updating single employee
    public int updateEmployee(Employee employee){
        SQLiteDatabase database = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_FIRST_NAME, employee.getFirst_name());
        values.put(KEY_LAST_NAME, employee.getLast_name());
        values.put(KEY_PHONE_NUMBER_MOBILE, employee.getPhone_mobile());
        values.put(KEY_PHONE_NUMBER_OFFICE, employee.getPhone_office());
        values.put(KEY_HAS_DIRECT_REPORTS, employee.getHas_direct_reports());
        values.put(KEY_EMAIL, employee.getEmail());
        values.put(KEY_COST_CENTER, employee.getCost_center_id());
        values.put(KEY_PAYROLL_TITLE, employee.getPayroll_title());
        values.put(KEY_THUMBNAIL_IMAGE, employee.getThumbnailData());

        return database.update(TABLE_EMPLOYEE, values, KEY_ID + " = ?",
                new String[] {String.valueOf(employee.getEmployee_number())});
    }

    //Delete single employee
    public void deleteEmployee(Employee employee) {
        SQLiteDatabase database = this.getWritableDatabase();
        database.delete(TABLE_EMPLOYEE, KEY_ID + " = ?",
                new String[] {String.valueOf(employee.getEmployee_number())});
        database.close();
    }
}

जहां मैं डेटाबेस बनाता, जोड़ता और प्राप्त करता हूं

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTopList = (ListView) findViewById(R.id.mTopList);
        TopListCursorAdapter topAdapter = new TopListCursorAdapter(this, topViewList(mTopCursor));
        mTopList.setAdapter(topAdapter);

        directReportListView = (ListView) findViewById(R.id.mDirectReportList);
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
        mProgressBar.setVisibility(View.VISIBLE);
        mBottomListViewAdapter = new BottomListViewAdapter(this, mEmployees);
        directReportListView.setAdapter(mBottomListViewAdapter);
        getBottomViewXMLData();


        //GUI for seeing android SQLite Database in Chrome Dev Tools
        Stetho.InitializerBuilder inBuilder = Stetho.newInitializerBuilder(this);
        inBuilder.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this));
        Stetho.Initializer in = inBuilder.build();
        Stetho.initialize(in);

        //Top List View work
        //  mTopListViewAdapter = new TopListCursorAdapter(this, mEmployees);


    }

    public void getBottomViewXMLData() {
        OkHttpClient client = getUnsafeOkHttpClient();
        Request request = new Request.Builder()
                .url(getString(R.string.API_FULL_URL))
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                final String responseData = response.body().string();
                final InputStream stream = new ByteArrayInputStream(responseData.getBytes());
                final XMLPullParserHandler parserHandler = new XMLPullParserHandler();
                DatabaseHandler databasehandler = new DatabaseHandler(getApplicationContext());
                final ArrayList<Employee> employees = (ArrayList<Employee>) parserHandler.parse(stream);

                for (Employee e : employees) {
                    databasehandler.addEmployee(e);
                }




                Log.i("ADAM", databasehandler.toString());

                mEmployees.clear();
                mEmployees.addAll(employees);


                //tell adapter on the UI thread its data changed
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mBottomListViewAdapter.notifyDataSetChanged();
                        directReportListView.setVisibility(View.VISIBLE);
                        mProgressBar.setVisibility(View.GONE);
                    }
                });
            }
        });
    }

    public Cursor topViewList(Cursor employeeCursor) {
        //always starts with Mark
        int startingEmployeeNumber = startingEmployeeNumber(int);
        DatabaseHandler mDatabase = new DatabaseHandler(this);
        SQLiteDatabase database = mDatabase.getWritableDatabase();
        mDatabase.getEmployee(startingEmployeeNumber);
        employeeCursor = database.rawQuery("SELECT  * FROM employee", null);

        return employeeCursor;
    }
}

TopListCursorAdapter

public class TopListCursorAdapter extends CursorAdapter {
    public TopListCursorAdapter(Context context, Cursor cursor) {
        super(context, cursor, 0);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(R.layout.contact_cardview_layout, parent, false);
    }

    @Override
    public void bindView(View view, final Context context, Cursor cursor) {

        TextView tvFirstName = (TextView) view.findViewById(R.id.personFirstName);
        TextView tvLastName = (TextView) view.findViewById(R.id.personLastName);
        TextView tvTitle = (TextView) view.findViewById(R.id.personTitle);
        ImageView mPeepPic = (ImageView) view.findViewById(R.id.person_photo);
        ImageView mDetailsButton = (ImageButton) view.findViewById(R.id.fullDetailButton);
        CardView mCardView = (CardView) view.findViewById(R.id.home_screen_cardView);

        String mFirstName = cursor.getString(cursor.getColumnIndexOrThrow("First_name"));
        String mLastName = cursor.getString(cursor.getColumnIndexOrThrow("Last_name"));
        String mPayrollTitle = cursor.getString(cursor.getColumnIndexOrThrow("Payroll_title"));
        String mPicData = cursor.getString(cursor.getColumnIndexOrThrow("ThumbnailData"));

        //parse image from database
        byte[] imageAsBytes = Base64.decode(mPicData.getBytes(), Base64.DEFAULT);
        Bitmap parsedImage = BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length);
        mPeepPic.setImageBitmap(parsedImage);

        tvFirstName.setText(mFirstName);
        tvLastName.setText(mLastName);
        tvTitle.setText(mPayrollTitle);


        mDetailsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, "This is working well here also", Toast.LENGTH_SHORT).show();
            }
        });

    }
}
-1
Adam Gardner 23 जिंदा 2017, 22:02
1
क्या आप एसक्यूएल मूल बातें जानते हैं? SELECT column1 AS alias1
 – 
Selvin
23 जिंदा 2017, 22:15
सोचा था कि आप डेटाबेस के चयन पर चयन नहीं करते हैं? क्या मैं डेटाबेसहैंडलर में ऐसा करने में सक्षम हूं या क्या मुझे वह कर्सर करना है?
 – 
Adam Gardner
23 जिंदा 2017, 22:20
नहीं, मुझे ऑनक्रेट में चयन के बारे में नहीं लिखा गया था ... मैं चयन के बारे में बात कर रहा था जब आप कर्सर एडाप्टर के लिए कर्सर प्राप्त कर रहे हों
 – 
Selvin
23 जिंदा 2017, 22:23
मैंने अपना एडॉप्टर मूल पोस्ट में जोड़ा। मैं getColumnIndexOrThrow का उपयोग कर रहा हूं और प्रत्येक आइटम पर एक टेक्स्ट व्यू सेट कर रहा हूं जिसे मैं कार्डव्यू में प्रदर्शित करना चाहता हूं। क्या मुझे एडेप्टर में एक सेलेक्ट स्टेटमेंट की आवश्यकता है?
 – 
Adam Gardner
23 जिंदा 2017, 22:27
आप Cursor कैसे बनाते हैं जो आपके कस्टम CursorAdapter को भेजा जाता है?
 – 
Code-Apprentice
23 जिंदा 2017, 22:33

1 उत्तर

सबसे बढ़िया उत्तर

कई Android API विजेट जो SQLite डेटाबेस के साथ इंटरैक्ट करते हैं, यह मानते हैं कि Cursor में _id नाम का एक कॉलम है। इस त्रुटि को हल करने के लिए आपके पास कम से कम दो विकल्प हैं:

  1. _id नाम का कॉलम जोड़ें। आप इसे Employee_number के समान डेटा शामिल कर सकते हैं। ऐसा करने का सबसे आसान तरीका SELECT Employee_number AS _id है।

  2. Android API के उन हिस्सों का उपयोग करने से बचें जो _id का उपयोग करते हैं और इन विधियों के अपने संस्करण स्वयं लिखें।

0
Code-Apprentice 23 जिंदा 2017, 22:32
मैं पहली कोशिश करूँगा जैसा कि आसान लगता है क्योंकि मैं डेटाबेस अवधि के लिए नया हूँ और Android में कर्सर का उपयोग कर रहा हूँ
 – 
Adam Gardner
23 जिंदा 2017, 22:35
सोचें कि मैं शुरू करने की कोशिश करूंगा क्योंकि मैंने स्पष्ट रूप से कुछ याद किया है और मैं पूरी तरह से समझ नहीं पा रहा हूं कि यह सब एक साथ कैसे जुड़ता है।
 – 
Adam Gardner
23 जिंदा 2017, 23:03
आपको कामयाबी मिले! कुछ चीजों की कोशिश करने के बाद और अधिक सहायता की आवश्यकता होने के बाद बेझिझक और प्रश्न पोस्ट करें।
 – 
Code-Apprentice
23 जिंदा 2017, 23:52