Ich kann sehen, dass meine Datenbank korrekt gespeichert wird, wenn ich sie nach dem Durchlaufen meiner geparsten XML-Webdienstantwort erstelle. Das Problem ist, ich versuche, eine Zeile aus dieser Tabelle zu entfernen, und es gibt zwei Zeilen mit der gleichen Mitarbeiternummer. Ich habe eine Methode, die ich versuche, einen der Datensätze zu löschen, damit ich den anderen verwenden kann, um die neue Liste zu erstellen, um eine Listview aufzufüllen.Entfernen Sie eine Zeile aus der Datenbank, um eine neue Liste zu erstellen
public class MainActivity extends AppCompatActivity {
private ListView mTopList, directReportListView;
private ProgressBar mProgressBar;
private ArrayList<Employee> mEmployees = new ArrayList<>();
private BottomListViewAdapter mBottomListViewAdapter;
EmployeeDBHandler dbHandler;
SQLiteDatabase db;
SimpleCursorAdapter simpleCursorAdapter;
private String startingEmployeeID = employeeNumberWishToDelete;
private String table = "employees";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbHandler = new EmployeeDBHandler(getApplicationContext());
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();
displayTopList(startingEmployeeID);
//displayTopList();
//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);
}
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();
final ArrayList<Employee> employees = (ArrayList<Employee>) parserHandler.parse(stream);
for (Employee e : employees) {
dbHandler.addEmployee(e);
}
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 void displayTopList(String employeeNumber) {
String table = "employees";
String whereClause = "Employee_number=?";
String[] whereArgs = new String[] {String.valueOf(employeeNumber)};
db = dbHandler.getWritableDatabase();
db.delete(table, whereClause, whereArgs);
// Cursor cursor = (Cursor) dbHandler.getEmployee(startingEmployeeID);
// Log.i("ADAM", cursor.toString());
}
}
Wenn ich es laufen, ich bin
Fehlercode bekommen: 1555 (SQLITE_CONSTRAINT_PRIMARYKEY) verursacht durch: Abbruch wegen Einschränkungsverletzung. (UNIQUE-Einschränkung fehlgeschlagen: employees.Employee_number (Code 1555)).
Ich weiß es, weil der zweite Datensatz mit der gleichen Mitarbeiternummer nicht gelöscht wird. Nicht sicher, warum der obige Code den Datensatz nicht löscht. Ist es möglich, 1 Zeile zu löschen und in einer anderen Liste zu verwenden?
public class EmployeeDBHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "OneTeam";
private static final String TABLE_EMPLOYEE = "employees";
//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 EmployeeDBHandler(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();
Employee employee = null;
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) {
if(cursor.moveToFirst()) {
employee = 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));
}
}
cursor.close();
database.close();
return employee;
}
//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();
}
}
"Ich habe mehrere Dinge mit Cursors und SimpleAdaptern versucht, aber nichts, was ich tue, scheint die Datensätze zu löschen und einen anderen Listeneintrag zu füllen." Dies ist der richtige Weg, es zu tun. Sie sollten genau zeigen, was Sie probiert haben. –
Ich habe meinen Code mit der Methode aktualisiert, mit der ich versuche, einen doppelten Datensatz zu löschen. –
Denken Sie daran, dass Java-Code eine Klasse haben muss. Bitte zeigen Sie dies in dem hier angegebenen Code. –