2017-01-23 3 views
0

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(); 
    } 
} 
+1

"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. –

+0

Ich habe meinen Code mit der Methode aktualisiert, mit der ich versuche, einen doppelten Datensatz zu löschen. –

+0

Denken Sie daran, dass Java-Code eine Klasse haben muss. Bitte zeigen Sie dies in dem hier angegebenen Code. –

Antwort

1

Gibt es andere Datensätze mit einer doppelten Employee_number? Diese verursachen auch das Problem, über das Sie berichten. Sie haben die Einschränkung verletzt, dass nicht mehrere Datensätze mit derselben Angestelltennummer vorhanden sein können. Wenn Sie mehrere Datensätze mit derselben Angestelltennummer benötigen, legen Sie stattdessen einen anderen Primärschlüssel (möglicherweise automatisches Erhöhen) fest. Dann löscht Ihr Löschbefehl beide Datensätze.

Bearbeiten: Sie können die von Ihnen erstellte Einschränkung nicht verletzen. Sie müssen also entweder sicherstellen, dass Sie beim Hinzufügen von Datensätzen nicht dagegen verstoßen (vor dem Hinzufügen nach einer bereits vorhandenen Employee_number suchen) oder die Primärdatenbank ändern Schlüssel wie vorgeschlagen.

Bearbeiten 2: Hier ist die Syntax für eine Tabelle mit einem automatischen Primärschlüssel: Hinzufügen zu dieser Tabelle wird automatisch "id" für Sie ausfüllen, um sicherzustellen, dass es eindeutig ist.

+0

Nein, es gibt nur einen doppelten Datensatz im Web-Service, und ich kann sie nicht dazu bringen, das Duplikat zu entfernen. Deshalb versuche ich es in SQLite zu tun, nachdem ich die Antwort analysiert und gespeichert habe. –

+0

Ist es möglich, eine eindeutige ID zu erstellen, die nicht an die Antwort oder POJO gebunden ist? Erstellt einfach eine 1, 2, 3 usw. für jede Zeile, die hinzugefügt wird? Vielleicht kann ich so eine spezifische neue eindeutige ID bekommen und diese löschen? Ich dachte daran, etwas wie Sugar ORM zu verwenden, aber das würde nicht helfen, da ich die selbe employeeNumber zweimal der Datenbank hinzugefügt habe. –

+0

Ja, das ist die Spalte auto_increment, auf die ich mich bezog - siehe Edit 2 für ein Beispiel – Bilko

Verwandte Themen