Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我的数据库不是';t使用SQLite更新我的行-我觉得一切都很完美_Android_Database_Sqlite_Sql Update - Fatal编程技术网

Android 我的数据库不是';t使用SQLite更新我的行-我觉得一切都很完美

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

这里有一堆活动部件,因此我将尝试彻底了解: 我的第一个活动是一个表单,它通过收集客户对象的大多数字段并为信用卡信息字段传递“null”来创建客户对象。下面是模型“Customer”类和收集信息的活动。到目前为止,一切顺利

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