मैं 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 उत्तर
कई Android API विजेट जो SQLite डेटाबेस के साथ इंटरैक्ट करते हैं, यह मानते हैं कि Cursor
में _id
नाम का एक कॉलम है। इस त्रुटि को हल करने के लिए आपके पास कम से कम दो विकल्प हैं:
_id
नाम का कॉलम जोड़ें। आप इसेEmployee_number
के समान डेटा शामिल कर सकते हैं। ऐसा करने का सबसे आसान तरीकाSELECT Employee_number AS _id
है।Android API के उन हिस्सों का उपयोग करने से बचें जो
_id
का उपयोग करते हैं और इन विधियों के अपने संस्करण स्वयं लिखें।
संबंधित सवाल
नए सवाल
android
एंड्रॉइड Google का मोबाइल ऑपरेटिंग सिस्टम है, जिसका उपयोग प्रोग्रामिंग या डिजिटल डिवाइस (स्मार्टफोन, टैबलेट, ऑटोमोबाइल्स, टीवी, वियर, ग्लास, IoT) को विकसित करने के लिए किया जाता है। एंड्रॉइड से संबंधित विषयों के लिए, एंड्रॉइड-विशिष्ट टैग जैसे कि एंड्रॉइड-इरादे, एंड्रॉइड-गतिविधि, एंड्रॉइड-एडॉप्टर आदि का उपयोग करें। विकास या प्रोग्रामिंग के अलावा अन्य प्रश्नों के लिए, लेकिन एंड्रॉइड फ्रेमवर्क से संबंधित हैं, इस लिंक का उपयोग करें: https: // android.stackexchange.com।
SELECT column1 AS alias1
Cursor
कैसे बनाते हैं जो आपके कस्टमCursorAdapter
को भेजा जाता है?