属性的顺序搞砸了

时间:2018-04-29 09:06:08

标签: android sqlite attributes tuples android-sqlite

在Android SQLite中,我试图在我上线时获取客户的一些细节,将其存储在SQLite数据库中,并在我离线时显示它们。

不幸的是,当这样做时,列的顺序不幸地搞砸了。 我有下表TABLE_AGEING_VALUES_ALL

Loan_No text primary key,
agreement_date date,
branch_name text,
loan_status text,
address1 text,
address2 text,
status_type integer,
user_id integer

当我在线时,客户详细信息显示如下:

示例1:

Loan Number: CDAGRTW1412090016
Agreement Date: 12/9/2014 12:00:00 AM
Branch Name:
Loan Status: Expired
Address 1: 9/43, MOTI BAG NAGAL FATHORI YAMUNA BRIDGE
Address 2:

不幸的是,当我离线时,字段的顺序就像这样搞乱了。

示例1:

Loan Number: CDAGRTW1412090016
Agreement Date:
Branch Name: 9/43, MOTI BAG NAGAL FATHORI YAMUNA BRIDGE
Loan Status:
Address 1: Expired
Address 2: 12/9/2014 12:00:00 AM

我想知道它为什么会发生这样的事情。

这是我在主活动片段Java文件中的更新或插入函数调用,这取决于在任何给定的情况下该行是否已经存在:

onResponse()函数调用:

if (db.selectAgeingvalues(Loan_No, status_type, user_id) == 0) {
    db.insertAgeingvalues(Loan_No, agreement_date, branch_name, loan_status, address1, address2, status_type, user_id);
} else {
    db.updateAgeingvalues(Loan_No, agreement_date, branch_name, loan_status, address1, address2, status_type, user_id);
}

这是我的select函数调用,用于在我离线时从存储的Android SQLite数据库表中检索客户的详细信息:

onFailure()函数调用:

sqliteDB db = new sqliteDB(getActivity());
List<String> AgeingvaluesList[] = db.selectAgeingvalues("-1", user_id);
for(int i = 0; i < AgeingvaluesList[0].size(); i++)
{
    Loan_No = AgeingvaluesList[0].get(i);
    agreement_date = AgeingvaluesList[1].get(i);
    branch_name = AgeingvaluesList[2].get(i);
    loan_status = AgeingvaluesList[3].get(i);
    address1 = AgeingvaluesList[4].get(i);
    address2 = AgeingvaluesList[5].get(i);
    status_type = AgeingvaluesList[6].get(i);
}

以下是我自己声明的sqliteDB.java Java文件中的SELECT,INSERT,UPDATE,onCreate()和onUpgrade()函数调用,如下所示,例如:

onCreate(SQLiteDatabase sqLiteDatabase)函数调用

为了能够在存储的Android SQLite数据库表中创建表TABLE_AGEING_VALUES_ALL(如果它已经不存在)或者删除它并根据以下指定的变量值重新创建它(如果它已经存在) sqLiteDatabase

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
    // TODO Auto-generated method stub
    sqLiteDatabase.execSQL(
            "create table " + TABLE_AGEING_VALUES_ALL +
                    "("
                    + "Loan_No text not null unique primary key,"
                    + "branch_name text,"
                    + "address1 text not null,"
                    + "address2 text,"
                    + "loan_status text not null,"
                    + "agreement_date text not null,"
                    + "status_type number not null,"
                    + "user_id text not null"
                    + ")"
    );
}

onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1)函数调用

为了能够将表TABLE_AGEING_VALUES_ALL升级到存储的Android SQLite数据库表(如果它已经存在或不存在)在将移动应用程序升级到更新版本或卸载并重新安装移动应用程序的过程中较新版本,基于以下指定的变量值,sqLiteDatabaseii1

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    // TODO Auto-generated method stub
    sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_AGEING_VALUES_ALL);
    onCreate(sqLiteDatabase);
}

insertAgeingvalues(String Loan_No, String agreement_date, String branch_name, String loan_status, String address1, String address2, String status_type, String user_id)函数调用

为了能够在已存在的Android SQLite数据库表中插入一行(如果它已经不存在),基于以下指定的变量值,Loan_Noagreement_date,{{1 }},branch_nameloan_statusaddress1address2status_type

user_id

public boolean insertAgeingvalues(String Loan_No, String agreement_date, String branch_name, String loan_status, String address1, String address2, String status_type, String user_id) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("Loan_No", Loan_No); contentValues.put("agreement_date", agreement_date); contentValues.put("branch_name", branch_name); contentValues.put("loan_status", loan_status); contentValues.put("address1", address1); contentValues.put("address2", address2); contentValues.put("status_type", status_type); contentValues.put("user_id", user_id); db.insert(TABLE_AGEING_VALUES_ALL, null, contentValues); return true; } 函数调用:

为了能够根据已分配的变量值updateAgeingvalues(String Loan_No, String agreement_date, String branch_name, String loan_status, String address1, String address2, String status_type, String user_id)Loan_Noagreement_date将行更新到存储的Android SQLite数据库表中(如果已存在) ,branch_nameloan_statusaddress1address2status_type

user_id

public int updateAgeingvalues(String Loan_No, String agreement_date, String branch_name, String loan_status, String address1, String address2, String status_type, String user_id) { SQLiteDatabase db = getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("Loan_No", Loan_No); contentValues.put("agreement_date", agreement_date); contentValues.put("branch_name", branch_name); contentValues.put("loan_status", loan_status); contentValues.put("address1", address1); contentValues.put("address2", address2); contentValues.put("status_type", status_type); contentValues.put("user_id", user_id); // updating row return db.update(TABLE_AGEING_VALUES_ALL, contentValues, "Loan_No = ? AND user_id = ?", new String[] {Loan_No, user_id}); } 函数调用

Android SQLite数据库表:

selectAgeingvalues(String Loan_No, String status_type, String user_id)

public int selectAgeingvalues(String Loan_No, String status_type, String user_id) { int count = 0; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor; cursor = db.rawQuery("SELECT EXISTS(SELECT Loan_No FROM " + TABLE_AGEING_VALUES_ALL + " WHERE user_id = \"" + user_id + "\" AND Loan_No = \"" + Loan_No + "\" AND status_type = " + status_type + ")", null); if (cursor.moveToFirst()) { do { count = Integer.parseInt(cursor.getString(0)); } while (cursor.moveToNext()); } return count; } 函数调用

为了能够从存储的Android SQLite数据库表中检索一行(如果它已经存在或未存在),基于以下指定的变量值selectAgeingvalues(String status_type, String user_id)status_type

user_id

我做错了什么?

2 个答案:

答案 0 :(得分:1)

而不是cursor.getString(1);将其更改为cursor.getString(cursor.getColumnIndex("Loan_No "));,并为所有相应字段执行此操作。

始终使用列名而不是位置,因为列位置可能会更改。 当然列名也可以改变,但是如果你添加一个新列并且它在第1列和第2列之间的位置,就说了。如果你使用数字,你需要更改你的代码。但如果你使用名字,你会没事的。

答案 1 :(得分:0)

(D。&#39的原始答案,仅供参考)。

我认为您的问题出在

for(int i = 0; i < AgeingvaluesList[0].size(); i++)

使用此AgeingvaluesList[0].size();,您只获得第一个元素的大小,并且也是第一个元素的大小!

将其更改为AgeingvaluesList().size(); 也请您注意,而不是cursor.getString(1);将其更改为cursor.getString(cursor.getColumnIndex("Loan_No "));并为所有相应字段执行此操作