Android 每次我打开我的应用程序,我的数据库都会被一次又一次地创建

Android 每次我打开我的应用程序,我的数据库都会被一次又一次地创建,android,android-sqlite,Android,Android Sqlite,我正在从web服务响应填充SQLite数据库。应用程序第一次运行时,应用程序将正确显示ListView。我遇到的问题是,当我关闭应用程序并再次打开它时,数据库只是创建同一个表,而不是覆盖数据。因此,作为回报,我的数据库不断一次又一次地生成相同的行。因此,一个包含8行的响应开始变成16、24等 我曾尝试更改数据库的版本号以强制onUpgrade,但没有任何结果 数据库类 public class EmployeeDBHandler extends SQLiteOpenHelper { pr

我正在从web服务响应填充SQLite数据库。应用程序第一次运行时,应用程序将正确显示ListView。我遇到的问题是,当我关闭应用程序并再次打开它时,数据库只是创建同一个表,而不是覆盖数据。因此,作为回报,我的数据库不断一次又一次地生成相同的行。因此,一个包含8行的响应开始变成16、24等

我曾尝试更改数据库的版本号以强制onUpgrade,但没有任何结果

数据库类

public class EmployeeDBHandler extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 3;
    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";
    private final static String DB_CLIENTS_ID = "_id";

    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 + "("
                + DB_CLIENTS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                + KEY_ID + " TEXT,"
                + 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.replace(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();
    }

    //delete row
    public void delete(int id) {
        SQLiteDatabase db = this.getWritableDatabase();
        if (db == null) {
            return;
        }
        db.delete(TABLE_EMPLOYEE, "Employee+number = ?", new String[]{String.valueOf(id)});
        db.close();
    }
}
public类EmployeeDBHandler扩展SQLiteOpenHelper{
私有静态最终int数据库_VERSION=3;
私有静态最终字符串数据库\u NAME=“OneTeam”;
私有静态最终字符串表\u EMPLOYEE=“employees”;
//员工表列名称
私有静态最终字符串KEY\u ID=“员工编号”;
私有静态最终字符串键\u FIRST\u NAME=“FIRST\u NAME”;
私有静态最终字符串键\u LAST\u NAME=“LAST\u NAME”;
私有静态最终字符串密钥\u PHONE\u NUMBER\u MOBILE=“PHONE\u MOBILE”;
专用静态最终字符串键\u PHONE\u NUMBER\u OFFICE=“PHONE\u OFFICE”;
私有静态最终字符串键\u PAYROLL\u TITLE=“PAYROLL\u TITLE”;
私有静态最终字符串键\u HAS\u DIRECT\u REPORTS=“HAS\u DIRECT\u REPORTS”;
私有静态最终字符串密钥\u EMAIL=“EMAIL”;
私有静态最终字符串KEY\u COST\u CENTER=“COST\u CENTER\u id”;
私有静态最终字符串键\u THUMBNAIL\u IMAGE=“ThumbnailData”;
私有最终静态字符串DB_CLIENTS_ID=“_ID”;
公共EmployeeDBHandler(上下文){
super(上下文、数据库名称、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase db){
字符串CREATE_EMPLOYEE_TABLE=“如果不存在则创建表”+表_EMPLOYEE+”(“
+DB_CLIENTS_ID+“整型主键自动递增,”
+键ID+“文本,”
+键\u FIRST\u NAME+“TEXT,”
+键\姓氏+“文本,”
+按键\手机号码\手机+“文本,”
+按键\电话号码\办公室+“文本,”
+关键字\u工资单\u标题+“文本,”
+键有直接报告+文本
+密钥_电子邮件+“文本,”
+按键\u缩略图\u图像+“文本,”
+关键字成本中心+“文本”
+ ")";
db.execSQL(创建员工表);
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
//删除旧表(如果存在)
db.execSQL(“如果存在删除表”+表_EMPLOYEE);
//再次创建表
onCreate(db);
}
//添加新员工
公共布尔加法雇员(雇员雇员){
SQLiteDatabase=this.getWritableDatabase();
ContentValues=新的ContentValues();
value.put(KEY_ID,employee.getEmployee_number());
value.put(KEY_FIRST_NAME,employee.getFirst_NAME());
value.put(KEY_LAST_NAME,employee.getLast_NAME());
value.put(KEY_PHONE_NUMBER_MOBILE,employee.getPhone_MOBILE());
value.put(KEY\u PHONE\u NUMBER\u OFFICE,employee.getPhone\u OFFICE());
value.put(KEY_有_DIRECT_REPORTS,employee.getHas_DIRECT_REPORTS());
value.put(KEY_EMAIL,employee.getEmail());
value.put(KEY_COST_CENTER,employee.getCost_CENTER_id());
value.put(KEY_PAYROLL_TITLE,employee.getPayroll_TITLE());
value.put(键\缩略图\图像,employee.getThumbnailData());
//插入行
replace(TABLE_EMPLOYEE,null,value);
close()数据库;
返回true;
}
//雇佣单身员工
公共雇员getEmployee(int employeeNumber){
SQLiteDatabase=this.getReadableDatabase();
Employee=null;
Cursor=database.query(表_EMPLOYEE,新字符串[]){
钥匙ID、钥匙名、钥匙姓、钥匙电话号码、办公室、钥匙电话号码、手机、,
KEY_有直接报告、KEY_电子邮件、KEY_成本中心、KEY_工资单、KEY_缩略图、KEY_图像、KEY_ID+“=?”,
新字符串[]{String.valueOf(employeeNumber)},null,null,null,null;
如果(光标!=null){
if(cursor.moveToFirst()){
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();
close()数据库;
返回员工;
}
//让所有员工
公共阵列列表getAllEmployees(){
ArrayList employeeList=新建ArrayList();
//选择所有查询
String selectQuery=“SELECT*FROM”+表\u员工;
SQLiteDatabase=this.getWritableDatabase();
Cursor=database.rawQuery(selectQuery,null);
//循环遍历所有行并添加到列表
if(cursor.moveToFirst()){
做{
员工=新员工();
employee.setEmployee_number(cursor.getString(cursor.getColumnIndex(KEY_ID));
employee.setFirst_name(cursor.getString(cursor.getColumnIndex(KEY_FIRST_name));
public class MainActivity extends AppCompatActivity {

    private ProgressBar mProgressBar;
    EmployeeDBHandler dbHandler;
    private int mStartingEmployeeID = "startingNumber";
    private String table = "employees";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dbHandler = new EmployeeDBHandler(getApplicationContext());
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
        mProgressBar.setVisibility(View.VISIBLE);
        getXMLData();
        //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 getXMLData() {
        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);
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mProgressBar.setVisibility(View.GONE);
                        displayTopList();
                        displayBottomList();
                    }
                });
            }
        });
    }
    public void displayTopList() {
        SQLiteDatabase db = dbHandler.getWritableDatabase();
        Cursor mTopListCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "=" + mStartingEmployeeID, null);
        ListView mTopListView = (ListView) findViewById(R.id.mTopList);
        TopListCursorAdapter topAdapter = new TopListCursorAdapter(this, mTopListCursor);
        mTopListView.setAdapter(topAdapter);
    }
    public void displayBottomList() {
        SQLiteDatabase db = dbHandler.getWritableDatabase();
        Cursor mBottomListCursor = db.rawQuery("SELECT * FROM " + table + " WHERE " + "Employee_number" + "!=" + mStartingEmployeeID, null);
        ListView mBottomListView = (ListView) findViewById(R.id.mDirectReportList);
        BottomListViewAdapter bottomAdapter = new BottomListViewAdapter(this, mBottomListCursor);
        mBottomListView.setAdapter(bottomAdapter);
    }

    @Override
    public void onBackPressed() {
        moveTaskToBack(false);
    }
}
    database.replace(TABLE_EMPLOYEE, null, values);