Member 12299159 Ответов: 3

Как обновить одно поле в определенной строке с помощью sqlite в android


Я разрабатываю базу данных в Sqlite. Я создал таблицу схема такова Sms_Address,Sms_Body,Status_Msg Начальное состояние сообщения-0. Я обновляю статус до 1 с помощью setStatus() функция в базе данных. Но статус всех строк обновляется. Я хочу обновить только одно поле с именем as Status_Msg проверка по флажку.

То setStatus() функция приведена ниже:

public String setStatus(){
        SQLiteDatabase sqldb = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        if (Status_Msg.equals(Status_Msg)) {
            values.put(Status_Msg, 1);
            sqldb.update(DB_Table1, values, "status = 0", null);
        }
        System.out.println("" + Status_Msg);
        sqldb.close();
        return Status_Msg;
    }


Я отображаю данные в базе данных с помощью showStatusChangedData() функция. Управление перемещается правильно в этой функции. Эта функция не показывает сообщения в listview пожалуйста, проверьте эти две функции.

То showStatusChangedData() функция приведена ниже:

public List<Message> showStatusChangedData(){
       SQLiteDatabase sqldb = getWritableDatabase();
       List<Message> list = new ArrayList<>();
       String select_query = "SELECT * FROM " + DB_Table1 + " where status = 1";

       Cursor cursor = sqldb.rawQuery(select_query,null);
           if (cursor.moveToFirst()) {
               do {
                   Message msg = new Message();
                   msg.setmAddress(cursor.getString(0));
                   msg.setmBody(cursor.getString(1));
                   msg.setmStatus(cursor.getString(2));
                   list.add(msg);
               } while (cursor.moveToNext());
           }
       return list;
   }


Что я уже пробовал:

Я попробовал выполнить следующий запрос
sqldb.update(DB_Table1, values,Sms_Address +"="+ Status_Msg,null);

Но это не работает.

Richard MacCutchan

Что "это не работает" значит? И какого результата вы ожидаете от этого заявления if (Status_Msg.equals(Status_Msg))?

Member 12299159

Статус сообщения равен 1, а затем обновите Статус сообщения.

Member 12299159

Я решил вчерашнюю проблему. Это новая проблема, с которой я столкнулся. Пожалуйста, помогите мне решить эту проблему. Я обновил вопрос.

Richard MacCutchan

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

Member 12299159

Я проверяю с помощью отладчика запрос обновления обновляет значение от 0 до 1 и
Выберите запрос, не содержащий никакого элемента.

Member 12299159

Как я создаю новый метод setStatus ()?
Как я создаю запрос обновления?

Member 12299159

Я решил вчерашнюю проблему. Я обновил вопрос.Пожалуйста, проверьте это и помогите мне решить эту проблему.

David Crow

Не имеет отношения ни к одной из проблем, но почему это так showStatusChangedData() зовущий getWritableDatabase() вместо getReadableDatabase()?

Код в системе setStatus() функция собирается изменить все Status_msg столбцы 1 для тех рядов, чьи status столбец равен 0 Возможно, именно поэтому вы обновляете более одной строки .

3 Ответов

Рейтинг:
2

Member 13777950

sqldb.update(DB_Table1, values,Sms_Address +"=?",новая строка[]{Status_Msg;});


Рейтинг:
1

GVS13

Чтобы обновить поле в определенной строке, попробуйте сделать следующее;

ContentValues cv = новые значения контента();
cv.put(Status_Msg, "1");
sqldb.обновление(DB_Table1, резюме, "код="+параметр _id, нуль);
sqldb.рядом();

Рекомендуется иметь первичный ключ для каждой строки данных.
Здесь _id будет вашим первичным ключом.

Еще одно предложение: когда вы закончите перебирать все строки в таблице, закройте объект cursor (cursor.close()).


Member 12299159

Я хочу обновить Status_Msg к значению 1.
Обновление вашего кода Sms_Address к status.
Пожалуйста, дайте мне другое решение.

Рейтинг:
1

GVS13

Смотрите обновленное решение выше.


Member 12299159

С помощью вашего кода вся колонка статуса обновляется.
Я хочу обновить конкретное поле, выбранное флажком.
Пожалуйста, дайте мне решение.

GVS13

Есть ли у вас первичный ключ для каждой строки, как я уже упоминал? Если вы используете первичный ключ для соответствующей строки для обновления, он будет работать только для этого поля строки.

Member 12299159

Да у меня есть первичный ключ как Sms_Id

GVS13

Можно ли опубликовать обновленную функцию SetStatus и фрагмент кода, который вы используете для обновления значения.

Member 12299159

да

Member 12299159

Код для функции разделе setstatus
<pre lang="java">public String setStatus(){
SQLiteDatabase sqldb = this.getWritableDatabase();
Значения ContentValues = новые значения ContentValues();
values.put(Status_Msg, "1");
sqldb.обновление(DB_Table1, ценности, "sms_id ="+ Sms_Id, нуль);
System.out.println("" + Status_Msg);
sqldb.рядом();
вернуться Status_Msg;
}
</pre>

GVS13

Все выглядит нормально. Не могли бы вы показать мне схему таблицы? Я имею в виду структуру вашей таблицы, то, как вы создаете таблицу.

Member 12299159

Да
Создание запроса на создание таблицы
public static final String DB_Query = "create table " + DB_Table1 + "(" +Sms_Id+" integer primary key autoincrement," +Sms_Address+" text not null, "+Sms_Body+" text not null, "+Status_Msg+" integer default 1)";

GVS13

Вы сохранили Status_Msg по умолчанию 1. Именно по этой причине вы получаете значение для всех Status_Msg как 1. Держите его по умолчанию 0.

Member 12299159

Но я проверяю функцию отображения для отображения данных в базе данных. Он показывает, что статус равен 0.

GVS13

Попробуйте сохранить значение по умолчанию равным 0.

Member 12299159

Хорошо

Member 12299159

Я проверил сохранение значения по умолчанию 0.
Вся колонка обновляется до 1.

GVS13

Держаться. Сначала внесите некоторые изменения, так как ваш Status_Msg является целочисленным полем keep values.put(Status_Msg, 1). И что вы пытаетесь получить, печатая System.out.println("" + Status_Msg)? Я думаю, что Status_Msg-это просто строковое имя столбца, которое у вас есть в таблице. Не так ли?

Member 12299159

То Status_Msg это целочисленная переменная, но она инициализирует строковый тип данных.
Я пытаюсь получить обновленный статус с помощью этого оператора System.out.println("" + Status_Msg);

GVS13

Я не понял, что именно вы делаете в своем коде. В любом случае сделай это;
//Создать базу данных и таблицу, если они не существуют
SQLiteDatabase sqldb = openOrCreateDatabase("myDatabase", MODE_PRIVATE, null);
sqldb.execSQL("создать таблицу, если не существует DB_Table1 (sms_id целое число первичный ключ автоинкремент, sms_address текст не нуль, sms_body текст не нуль, status_msg целое число, по умолчанию 0);");
sqldb.рядом();

//Для обновления конкретного значения таблицы

ContentValues cv = новые значения контента();
cv.put("status_msg", 1);
sqldb.обновление(DB_Table1, резюме, "sms_id="+параметр _id, нуль);
sqldb.рядом();

//Чтобы получить обновленные данные
SQLiteDatabase sqldb = openOrCreateDatabase("myDatabase", MODE_PRIVATE, null);
Курсор Рес = sqldb.rawQuery("выбрать * из DB_Table1 где sms_id=" + параметр _id + "", нуль);
РЭС.moveToFirst();
инт iStatus_Msg = рез.для данного locale ("РЭС".getColumnIndex("status_msg"));
РЭС.рядом();
sqldb.рядом()

Member 12299159

Я тебе все объясню. Я хочу реализовать функцию перемещения sms из спама в почтовый ящик. Я создаю базу данных для хранения спам-смс. В этой базе данных Status_Msg-это столбец для хранения статуса sms. Изначально статус всех сообщений равен 0. Я реализую одну функцию setStatus для обновления статуса sms. Когда статус sms обновится до 1, это sms переместится в почтовый ящик и отобразится. Это и есть работа.

Member 12299159

Если вам нужен файл базы данных, то я загружу его на эту страницу.

GVS13

Просто попробуйте с кодом, который я опубликовал. И увидеть результат.

Member 12299159

Что такое SQLiteDatabase sqldb = openOrCreateDatabase("myDatabase", MODE_PRIVATE, null); MODE_PRIVATE в этом операторе.
Я получаю ошибку для оператора MODE_PRIVATE.

GVS13

Это создаст базу данных с именем myDatabase, если она еще не создана, или откроет ее, если она уже существует.

Member 12299159

Я не понимаю вашего комментария
Произошла ошибка второй позиции MODE_PRIVATE.

Member 12299159

Приведенный выше код не работал должным образом в моем проекте.
Пожалуйста, дайте мне другое решение.