Порядок атрибутов запутался - PullRequest
0 голосов
/ 29 апреля 2018

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

Вот мои вызовы функций SELECT, INSERT, UPDATE, onCreate () и onUpgrade () внутри моего объявленного sqliteDB.java Java-файла, как показано ниже, например, такие как:

onCreate(SQLiteDatabase sqLiteDatabase) вызов функции

для возможности создания таблицы TABLE_AGEING_VALUES_ALL в хранимой таблице базы данных Android SQLite, если она уже не существует, или ее удаления и повторного создания, если она уже существует, на основе следующих присвоенных значений переменной 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, если она уже существует или нет при обновлении мобильного приложения до более новой версии или во время удаления и повторной установки мобильного приложения до более новой версии на основе следующих присвоенных значений переменных sqLiteDatabase, i и i1:

@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_No, agreement_date, branch_name, loan_status , address1, address2, status_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) вызов функции:

для возможности обновления строки в сохраненной таблице базы данных Android SQLite, если она уже существует, на основе следующих присвоенных значений переменных: Loan_No, agreement_date, branch_name, loan_status, address1, address2, status_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});
}

selectAgeingvalues(String Loan_No, String status_type, String user_id) функция вызова

Таблица базы данных Android SQLite:

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

selectAgeingvalues(String status_type, String user_id) вызов функции

, чтобы иметь возможность извлекать строку из сохраненной таблицы базы данных Android SQLite, если она уже существует или нет, на основе следующих присвоенных значений переменных status_type и user_id:

public List<String>[] selectAgeingvalues(String status_type, String user_id)
{
    String Loan_No;
    String agreement_date;
    String branch_name;
    String loan_status;
    String address1;
    String address2;
    List AgeingvaluesList[] = new List[7];
    for(int i = 0; i <= 6; i++) {
        AgeingvaluesList[i] = new ArrayList<String>();
    }
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor;
    cursor = db.rawQuery("SELECT * FROM "+TABLE_AGEING_VALUES_ALL+" WHERE user_id = \""+user_id+"\" AND status_type = "+status_type, null);
    if (cursor.moveToFirst()) {
        do {
            Loan_No = cursor.getString(0);
            AgeingvaluesList[0].add(Loan_No);

            agreement_date = cursor.getString(1);
            AgeingvaluesList[1].add(agreement_date);

            branch_name = cursor.getString(2);
            AgeingvaluesList[2].add(branch_name);

            loan_status = cursor.getString(3);
            AgeingvaluesList[3].add(loan_status);

            address1 = cursor.getString(4);
            AgeingvaluesList[4].add(address1);

            address2 = cursor.getString(5);
            AgeingvaluesList[5].add(address2);

            status_type = cursor.getString(6);
            AgeingvaluesList[6].add(status_type);
        } while (cursor.moveToNext());
    }
    return AgeingvaluesList;
}

Что я делаю достаточно неправильно?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

(оригинальный ответ Д., сохраняя все только для справочных целей).

Я думаю, что ваша проблема в

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

С этим AgeingvaluesList[0].size(); вы получаете только размер первого элемента, и это также размер первого элемента!

Измените его на AgeingvaluesList().size(); также, пожалуйста, не возражаете, вместо cursor.getString(1); измените его на cursor.getString(cursor.getColumnIndex("Loan_No ")); и сделайте это для всех соответствующих полей

0 голосов
/ 29 апреля 2018

Вместо cursor.getString(1); измените его на cursor.getString(cursor.getColumnIndex("Loan_No ")); и сделайте это для всех соответствующих полей.

Всегда используйте имя столбца вместо позиции, потому что позиция столбца может измениться. Конечно, имя столбца также может измениться, но, скажем, если вы добавляете новый столбец и он располагается между столбцом 1 и столбцом 2. Вам нужно изменить свой код, если вы используете число. Но если вы используете имя, у вас все будет хорошо.

...