2017-01-23 21 views
0

解析したxml Webサービスの応答をループした後、データベースを初めて作成するときにデータベースが正しく保存されていることがわかりました。問題は、そのテーブル内から行を削除しようとしていて、同じemployeeNumberを持つ2つの行があるということです。私はレコードの1つを削除しようとしているので、新しいリストを使用してリストビューを作成できるようにする方法があります。制約違反のため中止:によって引き起こさ1555(SQLITE_CONSTRAINT_PRIMARYKEY) :私はそれを実行するとデータベースから行を削除して新しいリストを作成

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

、私は

エラーコードを取得しています。 (UNIQUE制約に失敗しました:employees.Employee_number(code 1555))。

同じemployeeNumberを持つ2番目のレコードが削除されていないため、私はそのことを知っています。なぜ上記のコードがレコードを削除していないのか分かりません。 1行を削除して別のリストで使用できますか?

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

"私はカーソルとシンプルアダプターでいくつかのことを試しましたが、レコードを削除して別のリストビューを作成するようなものはありません。これは正しい方法です。試したことを正確に表示する必要があります。 –

+0

私は、重複レコードを削除しようとしているメソッドで自分のコードを更新しました –

+0

Javaコードにはクラスが必要です。このコードをここに掲載してください。 –

答えて

1

Employee_numberが重複している他のレコードはありますか?それらはあなたが報告している問題も引き起こします。同じEmployee_numberを持つ複数のレコードが存在できないという制約に違反しました。同じEmployee_numberを持つ複数のレコードを持つ必要がある場合は、代わりに別の主キー(自動増分)を設定します。次に、deleteコマンドは両方のレコードを削除します。

編集:作成した制約に違反することはできないため、レコードを追加する際に違反しないようにする必要があります(追加する前に既存のEmployee_numberを確認する)提案されたキー。

編集2: 自動プライマリキーを持つテーブルの構文は次のとおりです。 このテーブルに追加すると、自動的に「ID」が設定され、一意になります。

String CREATE_EMPLOYEE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_EMPLOYEE + "(" 
       + "id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, " 
       + KEY_ID + " STRING," 
       + KEY_FIRST_NAME + " TEXT, " 
       + KEY_LAST_NAME + " TEXT, " 
       ... 
+0

いいえ、Webサービスに重複レコードが1つしかありません。その重複を取り除くことができないため、応答を解析して保存した後にSQLiteで処理しようとしています。 –

+0

レスポンスやPOJOに関連付けられていない一意のIDを作成することはできますか?追加される行ごとに1、2、3などを作成するだけですか?おそらく私はその特定の新しい一意のIDを取得し、それを削除することができますか? Sugar ORMのようなものを使うことについて考えましたが、私は同じemployeeNumberがデータベースに2回追加されているので役に立たないでしょう。 –

+0

はい、それは私が参照していたauto_incrementの列です - 例2の編集を参照してください – Bilko

関連する問題