在放入Android SQLite之前删除重复记录

时间:2017-01-24 15:18:09

标签: android android-sqlite

我正在尝试替换我在Web服务调用中返回的重复记录。我已将数据保存到数据库并尝试执行db.replace。我收到错误java.lang.NullPointerException:尝试在null上调用虚方法'long android.database.sqlite.SQLiteDatabase.replace(java.lang.String,java.lang.String,android.content.ContentValues)'对象参考。

我不确定为什么我得到null,当我调试并通过这些点时,employeeNumber正确填充。所以它不应该创建记录,转到下一个等等,直到它看到相同的employeeNumber,然后删除下一个?

公共类MainActivity扩展了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 = employeNumberToRemove;
private String table = "employees";
private static final String KEY_ID = "Employee_number";


@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) {
                /*String table = "employees";
                String whereClause = "Employee_number=?";
                String[] whereArgs  = new String[] {String.valueOf(startingEmployeeID)};
                db = dbHandler.getWritableDatabase();
                db.delete(table, whereClause, whereArgs);*/
                dbHandler.addEmployee(e);
                ContentValues mContentValues = new ContentValues();
                mContentValues.put(KEY_ID, startingEmployeeID);
                db.replace(table, "Employee_number", mContentValues);
            }

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

}

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 :(得分:2)

您可以使用database.replace()方法而不是database.insert()。

请检查sqliteDatabase.replace()

它将根据您的主键在内部检查是否存在前一行?如果是,则它将更新同一行或否,然后它将插入新行。

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.replace(TABLE_EMPLOYEE, null, values);
    database.close();
    return true;
}

将您的添加员工方法更新为

for (Employee e : employees) {

      dbHandler.addEmployee(e);

 }

从活动到此

的循环