Flutter создает помощник базы данных sqlite, чтобы вернуть только 1 строку или любой другой тип отдельного объекта - PullRequest
0 голосов
/ 01 ноября 2018

Использование sqlite в Android (java base) довольно просто. Я могу получить список данных или просто отдельные данные таким образом, используя свой пользовательский помощник базы данных.

* 1004 т.е. *:

    public String getLastNetPrintUrl() {
    String lastPrintUrl;
    String lastId = "SELECT * FROM " + TABLE_NET_PRINT + " WHERE " + COL_NETPRINT_ID +
            " = (SELECT MAX(" + COL_NETPRINT_ID + ") FROM " + TABLE_NET_PRINT + ")";
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(lastId, null);
    if(cursor.moveToFirst()) {
        lastPrintUrl = cursor.getString(4);
    } else {
        lastPrintUrl = "";
    }
    db.close();
    return lastPrintUrl;
}

В приведенном выше фрагменте кода я просто хочу получить последний записанный URL. Тогда в деятельности, я могу просто позвонить

String netPrintUrl = dbhelper.getLastNetPrintUrl();

Как я могу достичь той же цели, используя sqflite во Flutter?

То, что я сделал до сих пор,

  Future<String> getLastUrl() async {
var dbClient = await db;
String lastUrlQuery = 'SELECT * FROM device WHERE id = (SELECT MAX( id ) FROM device)';
var dbQuery = await dbClient.rawQuery(lastUrlQuery);
if (dbQuery.length > 0) {
  String lastUrl = dbQuery.first.values.toString();
  return lastUrl;
} else {
  return '192.168.11.17:7700';
}

}

Но всякий раз, когда я пытался вызвать этот метод, точно так же, как

String lastUrl = dbhelper.getLastUrl;

Тип значения Future не может быть присвоен переменной типа 'String';

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

* редактировать:

Эта таблица «Device» содержит только 2 столбца, которые представляют собой целочисленный уникальный идентификатор, и url (как текст).

редактировать: конечная часть кода

final _formKey = new GlobalKey<FormState>();
final _urlController = new TextEditingController();

DatabaseHelper dbhelper = DatabaseHelper();
String atiDeviceUrl;

Future getUrl() async{
  atiDeviceUrl = await dbhelper.getLastUrl();
  _urlController.text = atiDeviceUrl;
  print('atiDeviceUrl: $atiDeviceUrl');
}

@override
void initState() {
  getUrl();
  super.initState();
}

1 Ответ

0 голосов
/ 01 ноября 2018

Вам захочется ознакомиться с асинхронным программированием в Dart.

Когда вы вызываете асинхронную (async) функцию, такую ​​как ваша dbhelper.getLastUrl(), тело функции фактически не выполняется немедленно.

Вместо этого вам возвращается объект Future, и выполнение продолжается сразу же после того, как вы вызвали функцию. Асинхронная функция будет выполнена позже, в неопределенное время. Вот почему в результате вы не можете получить String, а Future<String>.

Итак, чтобы на самом деле получить String результат вашей функции и сделать что-нибудь полезное с ней в синхронном коде, вы должны дождаться завершения Future, используя Future.then(). Например:

dbhelper.getLastUrl().then((final String lastURL) {
  print("The last URL was: $lastURL");
});

Однако, если вы вызываете dbhelper.getLastUrl() из другой функции async и просто добавляете ключевое слово await, все выглядит намного проще:

final String lastURL = await dbhelper.getLastUrl();
print("The last URL was: $lastURL");

Под капотом это по сути эквивалентно предыдущему примеру, но Дарт автоматически генерирует для вас код обработчика обратного вызова.

Теперь, хорошая новость в том, что если вам нужно вызвать функцию async, например, из обработчика обратного вызова нажатия кнопки, вы обычно можете просто добавить волшебное ключевое слово async к этой функции обратного вызова, и все довольно легко. Например, попробуйте это:

RaisedButton(
  child: Text("Get the last URL"),
  onPressed: () async {
    final String lastURL = await dbhelper.getLastUrl();
    print("The last URL was: $lastURL");
  },
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...