Android 我的数据库不是';t使用SQLite更新我的行-我觉得一切都很完美
这里有一堆活动部件,因此我将尝试彻底了解: 我的第一个活动是一个表单,它通过收集客户对象的大多数字段并为信用卡信息字段传递“null”来创建客户对象。下面是模型“Customer”类和收集信息的活动。到目前为止,一切顺利Android 我的数据库不是';t使用SQLite更新我的行-我觉得一切都很完美,android,database,sqlite,sql-update,Android,Database,Sqlite,Sql Update,这里有一堆活动部件,因此我将尝试彻底了解: 我的第一个活动是一个表单,它通过收集客户对象的大多数字段并为信用卡信息字段传递“null”来创建客户对象。下面是模型“Customer”类和收集信息的活动。到目前为止,一切顺利 public class Customer { private UUID customerId; private String firstName; private String lastName; private String streetA
public class Customer {
private UUID customerId;
private String firstName;
private String lastName;
private String streetAddress;
private String city;
private String state;
private String zipCode;
private String email;
private String cardNum;
private String cardExp;
private String cvv;
private boolean isVisa;
private List<Session> mSessionList;
// Going to have to add billing info somehow. Maybe an inner class
public Customer() {
customerId = UUID.randomUUID();
firstName = "firstName";
lastName = "lastName";
streetAddress = "streetAddress";
city = "city";
state = "state";
zipCode = "zip";
email = "email";
cardNum = "cardNum";
cardExp = "cardExp";
cvv = "cvv";
isVisa = true;
}
public Customer(String firstName, String lastName, String streetAddress, String city, String state,
String zipCode, String email, String cardNum, String cardExp, String cvv, boolean isVisa) {
this.customerId = UUID.randomUUID();
this.firstName = firstName;
this.lastName = lastName;
this.streetAddress = streetAddress;
this.city = city;
this.state = state;
this.zipCode = zipCode;
this.email = email;
this.cardNum = cardNum;
this.cardExp = cardExp;
this.cvv = cvv;
this.isVisa = true;
}
public String getCardNum() {
return cardNum;
}
public boolean isVisa() {
return isVisa;
}
public void setIsVis(boolean ans){
isVisa = ans;
}
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
public String getCardExp() {
return cardExp;
}
public void setCardExp(String cardExp) {
this.cardExp = cardExp;
}
public String getCvv() {
return cvv;
}
public void setCvv(String cvv) {
this.cvv = cvv;
}
public UUID getCustomerId() {
return customerId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getStreetAddress() {
return streetAddress;
}
public void setStreetAddress(String streetAddress) {
this.streetAddress = streetAddress;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email = email;
}
public List<Session> getSessionList() {
return mSessionList;
}
public void addSession(Session session){
mSessionList.add(session);
}
}
现在,当用户按下mAddButton时,我通过intent将Customer对象的UUID传递给新活动,并将信用卡字段为null的Customer对象写入数据库,到目前为止一切正常。在下一个屏幕上,我得到了意图,在数据库中找到该客户并填充不可编辑的字段。这些字段下面是用于填写信用卡信息的可编辑字段。我输入信用卡信息并将这些字段添加到Customer对象中,它似乎工作得很好(“我使用日志语句对其进行了测试”)。但当我检查数据库时,信用卡字段仍然为空。我的数据库方法有问题吗?这是我所有处理数据库的代码。任何帮助都将不胜感激。我正在努力学习这些东西
public class CustomerDbSchema {
public static final class CustomerTable{
public static final String NAME = "customers";
public static final class Cols {
public static final String CUSTOMER_ID = "customer_id";
public static final String FIRST_NAME = "fist_name";
public static final String LAST_NAME = "last_name";
public static final String STREET_ADDRESS = "street_address";
public static final String CITY = "city";
public static final String STATE = "state";
public static final String ZIPCODE = "zip_code";
public static final String EMAIL = "email";
public static final String CARD_NUM = "card_num";
public static final String CARD_EXP = "card_exp";
public static final String CVV = "cvv";
public static final String IS_VISA = "is_visa";
}
}
public static final class SessionTable{
public static final String NAME = "sessions";
public static final class Cols {
public static final String SESSION_ID = "session_id";
public static final String IS_COMPLETED = "is_completed";
public static final String DATE = "date";
public static final String CUSTOMER_ID = "customer_id";
}
}
}
我的助手类:
public class DbHelper extends SQLiteOpenHelper {
private static final int VERSION = 1;
private static final String DATABASE_NAME = "customer.db";
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + CustomerTable.NAME + "(" +
" _id integer primary key autoincrement, " +
CustomerTable.Cols.CUSTOMER_ID + ", " +
CustomerTable.Cols.FIRST_NAME + ", " +
CustomerTable.Cols.LAST_NAME + ", " +
CustomerTable.Cols.STREET_ADDRESS + ", " +
CustomerTable.Cols.CITY + ", " +
CustomerTable.Cols.STATE + ", " +
CustomerTable.Cols.ZIPCODE + ", " +
CustomerTable.Cols.EMAIL + ", " +
CustomerTable.Cols.CARD_NUM + ", " +
CustomerTable.Cols.CARD_EXP + ", " +
CustomerTable.Cols.CVV + ", " +
CustomerTable.Cols.IS_VISA +")");
db.execSQL("create table " + SessionTable.NAME + "(" +
" _id integer primary key autoincrement, " +
SessionTable.Cols.SESSION_ID + ", " +
SessionTable.Cols.DATE + ", " +
SessionTable.Cols.IS_COMPLETED + ", " +
SessionTable.Cols.CUSTOMER_ID + ")");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
游标包装类:
public class CustomerCursorWrapper extends CursorWrapper {
public CustomerCursorWrapper(Cursor cursor) {
super(cursor);
}
public Customer getCustomer(){
String customerID = getString(getColumnIndex(CustomerTable.Cols.CUSTOMER_ID));
String firstName = getString(getColumnIndex(CustomerTable.Cols.FIRST_NAME));
String lastName = getString(getColumnIndex(CustomerTable.Cols.LAST_NAME));
String streetAddress = getString(getColumnIndex(CustomerTable.Cols.STREET_ADDRESS));
String city = getString(getColumnIndex(CustomerTable.Cols.CITY));
String state = getString(getColumnIndex(CustomerTable.Cols.STATE));
String zip = getString(getColumnIndex(CustomerTable.Cols.ZIPCODE));
String email = getString(getColumnIndex(CustomerTable.Cols.EMAIL));
String cardNum = getString(getColumnIndex(CustomerTable.Cols.CARD_NUM));
String cardExp = getString(getColumnIndex(CustomerTable.Cols.CARD_EXP));
String cvv = getString(getColumnIndex(CustomerTable.Cols.CVV));
int isVisa = getInt(getColumnIndex(CustomerTable.Cols.IS_VISA));
Customer customer = new Customer(firstName, lastName, streetAddress, city,
state, zip, email, cardNum, cardExp, cvv, isVisa != 0);
return customer;
}
}
最后是一个Singleton类,它拥有编辑和更新数据库的大部分逻辑。请检查updateCustomer方法
public class CustomerList {
private static CustomerList sCustomerList;
private List<Customer> mCustomers;
private List<Session> mSessions;
private Context mContext;
private SQLiteDatabase mDatabase;
public static CustomerList get(Context context) {
if(sCustomerList == null){
sCustomerList = new CustomerList(context);
}
return sCustomerList;
}
private CustomerList(Context context) {
mContext = context.getApplicationContext();
mDatabase = new DbHelper(mContext).getWritableDatabase();
}
public List<Customer> getCustomers(){
List<Customer> customers = new ArrayList<>();
CustomerCursorWrapper cursor = queryCustomers(null, null);
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()){
customers.add(cursor.getCustomer());
cursor.moveToNext();
}
} finally {
cursor.close();
}
return customers;
}
public List<Session> getSessions() {
List<Session> sessions = new ArrayList<>();
SessionCursorWrapper cursor = querySessions(null, null);
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()){
sessions.add(cursor.getSession());
cursor.moveToNext();
}
} finally {
cursor.close();
}
return sessions;
}
public void addCustomer(Customer c){
ContentValues values = getCustomerContentValues(c);
mDatabase.insert(CustomerTable.NAME, null, values);
}
public void addSession(Session s){
ContentValues values = getSessionContentValues(s);
mDatabase.insert(SessionTable.NAME, null, values);
}
public Customer getCustomer(UUID id) {
CustomerCursorWrapper cursor = queryCustomers(
CustomerTable.Cols.CUSTOMER_ID + " = ?",
new String[] { id.toString() }
);
try{
if(cursor.getCount() == 0){
return null;
}
cursor.moveToFirst();
return cursor.getCustomer();
} finally {
cursor.close();
}
}
public void updateCustomer(Customer c){
String uuidString = c.getCustomerId().toString();
ContentValues values = getCustomerContentValues(c);
mDatabase.update(CustomerTable.NAME, values, CustomerTable.Cols.CUSTOMER_ID + " = ?",
new String[]{uuidString});
}
public Session getSession(UUID id) {
SessionCursorWrapper cursor = querySessions(
SessionTable.Cols.SESSION_ID + " = ?",
new String[]{id.toString()}
);
try {
if(cursor.getCount() == 0){
return null;
}
cursor.moveToFirst();
return cursor.getSession();
} finally {
cursor.close();
}
}
public void updateSession(Session s){
String uuidString = s.getSessionId().toString();
ContentValues values = getSessionContentValues(s);
mDatabase.update(SessionTable.NAME, values, SessionTable.Cols.SESSION_ID + " = ?",
new String[] {uuidString});
}
private static ContentValues getCustomerContentValues(Customer customer){
ContentValues values = new ContentValues();
values.put(CustomerTable.Cols.CUSTOMER_ID, customer.getCustomerId().toString());
values.put(CustomerTable.Cols.FIRST_NAME, customer.getFirstName());
values.put(CustomerTable.Cols.LAST_NAME, customer.getLastName());
values.put(CustomerTable.Cols.STREET_ADDRESS, customer.getStreetAddress());
values.put(CustomerTable.Cols.CITY, customer.getCity());
values.put(CustomerTable.Cols.STATE, customer.getState());
values.put(CustomerTable.Cols.ZIPCODE, customer.getZipCode());
values.put(CustomerTable.Cols.EMAIL, customer.getEmail());
values.put(CustomerTable.Cols.CARD_NUM, customer.getCardNum());
values.put(CustomerTable.Cols.CARD_EXP, customer.getCardExp());
values.put(CustomerTable.Cols.CVV, customer.getCvv());
values.put(CustomerTable.Cols.IS_VISA, customer.isVisa() ? 1 : 0);
return values;
}
private static ContentValues getSessionContentValues(Session session){
ContentValues values = new ContentValues();
values.put(SessionTable.Cols.SESSION_ID, session.getSessionId().toString());
values.put(SessionTable.Cols.DATE, session.getDate().getTime());
values.put(SessionTable.Cols.IS_COMPLETED, session.isCompleted() ? 1 : 0);
values.put(SessionTable.Cols.CUSTOMER_ID, session.getCusomerID().toString());
return values;
}
private CustomerCursorWrapper queryCustomers(String whereClause, String[] whereArgs){
Cursor cursor = mDatabase.query(
CustomerTable.NAME,
null,// columns - null selects all columns
whereClause,
whereArgs,
null, // groupBy
null, // having
null //orderBy
);
return new CustomerCursorWrapper(cursor);
}
private SessionCursorWrapper querySessions(String whereClause, String[] whereArgs){
Cursor cursor = mDatabase.query(
SessionTable.NAME,
null,// columns - null selects all columns
whereClause,
whereArgs,
null, // groupBy
null, // having
null //orderBy
);
return new SessionCursorWrapper(cursor);
}
}
我想出来了。我希望这会对将来的人有所帮助。在客户对象的构造函数中,我使用UUID.randomUUID()生成一个随机UUID 但当我试图从数据库中取出这些值时,它们存储在一个字符串中,必须插入到对象中才能重新创建它。以下是更新的CustomerCursorWrapper:
public class CustomerCursorWrapper extends CursorWrapper {
public CustomerCursorWrapper(Cursor cursor) {
super(cursor);
}
public Customer getCustomer(){
String customerID = getString(getColumnIndex(CustomerTable.Cols.CUSTOMER_ID));
String firstName = getString(getColumnIndex(CustomerTable.Cols.FIRST_NAME));
String lastName = getString(getColumnIndex(CustomerTable.Cols.LAST_NAME));
String streetAddress = getString(getColumnIndex(CustomerTable.Cols.STREET_ADDRESS));
String city = getString(getColumnIndex(CustomerTable.Cols.CITY));
String state = getString(getColumnIndex(CustomerTable.Cols.STATE));
String zip = getString(getColumnIndex(CustomerTable.Cols.ZIPCODE));
String email = getString(getColumnIndex(CustomerTable.Cols.EMAIL));
String cardNum = getString(getColumnIndex(CustomerTable.Cols.CARD_NUM));
String cardExp = getString(getColumnIndex(CustomerTable.Cols.CARD_EXP));
String cvv = getString(getColumnIndex(CustomerTable.Cols.CVV));
int isVisa = getInt(getColumnIndex(CustomerTable.Cols.IS_VISA));
Customer customer = new Customer(firstName, lastName, streetAddress, city,
state, zip, email, cardNum, cardExp, cvv, isVisa != 0);
customer.setCustomerId(UUID.fromString(customerID));
return customer;
}
}
我想出来了。我希望这会对将来的人有所帮助。在客户对象的构造函数中,我使用UUID.randomUUID()生成一个随机UUID 但当我试图从数据库中取出这些值时,它们存储在一个字符串中,必须插入到对象中才能重新创建它。以下是更新的CustomerCursorWrapper:
public class CustomerCursorWrapper extends CursorWrapper {
public CustomerCursorWrapper(Cursor cursor) {
super(cursor);
}
public Customer getCustomer(){
String customerID = getString(getColumnIndex(CustomerTable.Cols.CUSTOMER_ID));
String firstName = getString(getColumnIndex(CustomerTable.Cols.FIRST_NAME));
String lastName = getString(getColumnIndex(CustomerTable.Cols.LAST_NAME));
String streetAddress = getString(getColumnIndex(CustomerTable.Cols.STREET_ADDRESS));
String city = getString(getColumnIndex(CustomerTable.Cols.CITY));
String state = getString(getColumnIndex(CustomerTable.Cols.STATE));
String zip = getString(getColumnIndex(CustomerTable.Cols.ZIPCODE));
String email = getString(getColumnIndex(CustomerTable.Cols.EMAIL));
String cardNum = getString(getColumnIndex(CustomerTable.Cols.CARD_NUM));
String cardExp = getString(getColumnIndex(CustomerTable.Cols.CARD_EXP));
String cvv = getString(getColumnIndex(CustomerTable.Cols.CVV));
int isVisa = getInt(getColumnIndex(CustomerTable.Cols.IS_VISA));
Customer customer = new Customer(firstName, lastName, streetAddress, city,
state, zip, email, cardNum, cardExp, cvv, isVisa != 0);
customer.setCustomerId(UUID.fromString(customerID));
return customer;
}
}
updateCustomer方法代码似乎正确,您应该检查或共享updateCustomer方法所在的活动代码called@shantanu我更新了问题以显示调用update方法的活动。感谢您查看,我要做的第一件事是检查
update
是否正在更新,即update
方法返回更新的行数,作为int,因此我要更改mccustomerlist.updateCustomer(customer)代码>待更新int rows\u updated=mccustomerlist.updateCustomer(客户)代码>。如果为0,则问题是由于某种原因更新没有更新(首先猜测传递的_id不是现有行的_id)。也许添加一个简单的查询来提取游标,然后在更新之前使用csr.getCount()获取行数。我尝试从更新方法返回一个int值,得到0。然后我调用了getCustomers()方法,并在数据库中列出了每个客户的名字,结果一切正常。这让我很困惑updateCustomer方法代码似乎正确,您应该检查或共享updateCustomer方法所在的活动代码called@shantanu我更新了问题以显示调用update方法的活动。感谢您查看,我要做的第一件事是检查update
是否正在更新,即update
方法返回更新的行数,作为int,因此我要更改mccustomerlist.updateCustomer(customer)代码>待更新int rows\u updated=mccustomerlist.updateCustomer(客户)代码>。如果为0,则问题是由于某种原因更新没有更新(首先猜测传递的_id不是现有行的_id)。也许添加一个简单的查询来提取游标,然后在更新之前使用csr.getCount()获取行数。我尝试从更新方法返回一个int值,得到0。然后我调用了getCustomers()方法,并在数据库中列出了每个客户的名字,结果一切正常。这真让我困惑
public class CustomerCursorWrapper extends CursorWrapper {
public CustomerCursorWrapper(Cursor cursor) {
super(cursor);
}
public Customer getCustomer(){
String customerID = getString(getColumnIndex(CustomerTable.Cols.CUSTOMER_ID));
String firstName = getString(getColumnIndex(CustomerTable.Cols.FIRST_NAME));
String lastName = getString(getColumnIndex(CustomerTable.Cols.LAST_NAME));
String streetAddress = getString(getColumnIndex(CustomerTable.Cols.STREET_ADDRESS));
String city = getString(getColumnIndex(CustomerTable.Cols.CITY));
String state = getString(getColumnIndex(CustomerTable.Cols.STATE));
String zip = getString(getColumnIndex(CustomerTable.Cols.ZIPCODE));
String email = getString(getColumnIndex(CustomerTable.Cols.EMAIL));
String cardNum = getString(getColumnIndex(CustomerTable.Cols.CARD_NUM));
String cardExp = getString(getColumnIndex(CustomerTable.Cols.CARD_EXP));
String cvv = getString(getColumnIndex(CustomerTable.Cols.CVV));
int isVisa = getInt(getColumnIndex(CustomerTable.Cols.IS_VISA));
Customer customer = new Customer(firstName, lastName, streetAddress, city,
state, zip, email, cardNum, cardExp, cvv, isVisa != 0);
customer.setCustomerId(UUID.fromString(customerID));
return customer;
}
}