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