Jak zapisać do lokalnej pamięci za pomocą Fluttera?

103

W Androidzie, jeśli mam informacje, które chcę zachować między sesjami, wiem, że mogę użyć SharedPreferences lub utworzyć bazę danych SQLite, a nawet zapisać plik na urządzeniu i przeczytać go później.

Czy istnieje sposób na zapisywanie i przywracanie takich danych za pomocą Fluttera? A może musiałbym napisać kod specyficzny dla urządzenia dla systemu Android i iOS, jak w przykładzie usług ?

Reagankm
źródło

Odpowiedzi:

122

Jest kilka opcji:

Seth Ladd
źródło
Napisałem usługę flutter, aby uzyskać dostęp do SQLite, patrz github.com/ripple182/FlutterSQLiteSample
ripple182
czy to możliwe, jeśli używam pokoju? co się stanie z iOS, jeśli użyję Room?
MNFS
1
Wydaje się, że działa to lepiej w przypadku preferencji wspólnych: pub.dev/packages/shared_preferences
Yster,
54

Jeśli jesteś w sytuacji, w której chcesz zaoszczędzić niewielką wartość, którą chcesz później odnieść. wtedy powinieneś przechowywać swoje dane jako dane klucz-wartość przy użyciu shared_preferences

ale jeśli chcesz przechowywać duże dane, powinieneś skorzystać z SQLITE

jednak zawsze możesz użyć bazy danych Firebase, która jest dostępna w trybie offline

Ponieważ mówimy o lokalnej pamięci, zawsze możesz czytać i zapisywać pliki na dysku

Inne rozwiązania:

Raouf Rahiche
źródło
jak zdecydować, kiedy używać sqflite czy firebase?
stuckedoverflow
1
sqfliteprzechowuje go tylko w telefonie. firebasezostaje zsynchronizowany w centralnej bazie danych, w której możesz wykonywać zapytania w swoim zapleczu. firebaseułatwia również synchronizację między urządzeniami.
Feu
Pamiętaj, że Firestore Firebase ma domyślnie 10 MB i może mieć nie mniej niż 1 MB i maksymalnie 100 MB. Dostęp w trybie offline nie jest zalecany. Jeśli planujesz używać tej opcji tylko jako lokalnej pamięci masowej, a dane są duże, może być konieczne ponowne rozważenie. firebase.google.com/docs/reference/android/com/google/firebase/…
Lander
To powinna być preferowana odpowiedź, ponieważ wyjaśnia po prostu, gdzie szukać w różnych scenariuszach.
janpeterka
12

Możesz używać wspólnych preferencji z oficjalnych wtyczek fluttera. https://github.com/flutter/plugins/tree/master/packages/shared_preferences

Korzysta z preferencji wspólnych dla Androida, NSUserDefaults dla iOS.

Furkan Tektas
źródło
1
Czy jest to idealne rozwiązanie dla dużych baz danych?
temp_
1
@temp_ Nie wiem zbyt wiele o iOS. Jednak preferencje współdzielone w systemie Android zdecydowanie nie nadają się do dużych baz danych. Są zapisywane jako zwykłe pliki xml w systemie plików i na żądanie odczytywane z systemu plików. Służą głównie do przechowywania preferencji aplikacji i podobnych rzeczy.
zapomnij o
Wydaje się, że działa to lepiej w przypadku preferencji wspólnych: pub.dev/packages/shared_preferences
Yster,
9

Jeśli potrzebujesz przechowywać tylko proste wartości, takie jak token API lub dane logowania (nie hasła!), Oto czego użyłem:

import 'package:shared_preferences/shared_preferences.dart';

asyncFunc() async { // Async func to handle Futures easier; or use Future.then
  SharedPreferences prefs = await SharedPreferences.getInstance();
}
...

// Set
prefs.setString('apiToken', token);

// Get
String token = prefs.getString('apiToken');

// Remove
prefs.remove('apiToken');

Nie zapomnij dodać shared_preferenceszależności w swoim pubspec.yaml (zachowaj format odstępów):

dependencies:

  shared_preferences: any
Jerzy
źródło
8

Późna odpowiedź, ale mam nadzieję, że pomoże to również każdemu, kto tu później przyjedzie😁 ..

Podam kategorie do zapisania i ich najlepsze metody ...

  1. Wspólne preferencje Użyj tego, gdy przechowujesz proste wartości w pamięci, np. Motyw kolorów, język aplikacji, ostatnia pozycja przewijania (w czytanych aplikacjach) .. są to proste ustawienia, które chcesz zachować po ponownym uruchomieniu aplikacji. Możesz jednak użyć tego do przechowywania dużych rzeczy (listy, mapy, obrazy), ale wymagałoby to serializacji i deserializacji . Aby dowiedzieć się więcej o tej deserializacji i serializacji, przejdź tutaj .
  2. Pliki To bardzo pomaga, gdy masz dane, które są bardziej zdefiniowane przez ciebie, na przykład pliki dziennika, pliki obrazów i być może chcesz wyeksportować pliki csv .. Słyszałem, że ten typ trwałości może zostać wyczyszczony przez czyszczenie pamięci, gdy skończy się dysk space .. Nie jestem pewien, ponieważ nigdy go nie widziałem .. To również może przechowywać prawie wszystko, ale za pomocą serializacji i deserializacji.
  3. Zapisywanie do bazy danych Jest to niezwykle pomocne w przypadku danych, które są nieco złożone. I myślę, że to nie jest zmywane przez programy do czyszczenia dysków, ponieważ są one przechowywane w AppData (dla Androida). W tym przypadku Twoje dane są przechowywane w bazie danych SQLite. Jego wtyczka to SQFLite . Rodzaje danych, które możesz chcieć tutaj umieścić, są jak wszystko, co może być reprezentowane przez bazę danych.
emanuel sanga
źródło
0

Myślę, że jeśli zamierzasz przechowywać dużą ilość danych w lokalnej pamięci, możesz użyć biblioteki sqflite. Jest bardzo łatwy w konfiguracji i osobiście korzystałem z jakiegoś projektu testowego i działa dobrze.

https://github.com/tekartik/sqflite To samouczek - https://proandroiddev.com/flutter-bookshelf-app-part-2-personal-notes-and-database-integration-a3b47a84c57

Jeśli chcesz przechowywać dane w chmurze, możesz skorzystać z firebase. Jest to solidna usługa świadczona przez Google.

https://firebase.google.com/docs/flutter/setup

Ishan Fernando
źródło
0

Możesz użyć Localstorage

1- Dodaj zależność do pubspec.yaml( Zmień wersję na podstawie ostatniej )

dependencies:
  ...
  localstorage: ^3.0.0

2- Następnie uruchom następujące polecenie

flutter packages get

3- Zaimportuj lokalny magazyn:

import 'package:localstorage/localstorage.dart';

4- Utwórz instancję

class MainApp extends StatelessWidget {
  final LocalStorage storage = new LocalStorage('localstorage_app');
  ...
}

Dodaj przedmiot do lcoalstorage:

void addItemsToLocalStorage() {
  storage.setItem('name', 'Abolfazl');
  storage.setItem('family', 'Roshanzamir');

  final info = json.encode({'name': 'Darush', 'family': 'Roshanzami'});
  storage.setItem('info', info);
}

Zdobądź przedmiot z lcoalstorage:

void getitemFromLocalStorage() {
  final name = storage.getItem('name'); // Abolfazl
  final family = storage.getItem('family'); // Roshanzamir
  
  Map<String, dynamic> info = json.decode(storage.getItem('info'));
  final info_name=info['name'];
  final info_family=info['family'];
}

Usuń element z magazynu lokalnego:

void removeItemFromLocalStorage() {
  storage.deleteItem('name');
  storage.deleteItem('family');
  storage.deleteItem('info');
}
AbolfazlR
źródło
0

Możesz użyć SharedPreferences w przypadku niewielkiej ilości danych. Ale jeśli masz duże i złożone dane, powinieneś użyć Sqlite Database do lokalnego przechowywania w aplikacjach flutter.

Dhrumil Shah
źródło