Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Platforma Xamarin ma wbudowaną obsługę bazy danych SQLite, która jest dostępna w systemie Android i może być uwidoczniona za pomocą znanego narzędzia ADO. Składnia przypominająca platformę NET. Korzystanie z tych interfejsów API wymaga pisania instrukcji SQL przetwarzanych przez bibliotekę SQLite, takich jak CREATE TABLE
, INSERT
i SELECT
instrukcji.
Odwołania do zestawów
Aby uzyskać dostęp do biblioteki SQLite za pośrednictwem ADO.NET należy dodać System.Data
odwołania do projektu systemu Android, Mono.Data.Sqlite
jak pokazano poniżej:
Kliknij prawym przyciskiem myszy pozycję Odwołania > edytuj odwołania... a następnie kliknij, aby wybrać wymagane zestawy.
Informacje o pliku Mono.Data.Sqlite
Użyjemy Mono.Data.Sqlite.SqliteConnection
klasy , aby utworzyć pusty plik bazy danych, a następnie utworzyć wystąpienie SqliteCommand
obiektów, których możemy użyć do wykonywania instrukcji SQL względem bazy danych.
Tworzenie pustej bazy danych — wywołaj CreateFile
metodę z prawidłową (tj. zapisywalną) ścieżką pliku. Przed wywołaniem tej metody należy sprawdzić, czy plik już istnieje. W przeciwnym razie zostanie utworzona nowa (pusta) baza danych w górnej części starego pliku, a dane w starym pliku zostaną utracone.
Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath);
Zmienna dbPath
powinna być określana zgodnie z regułami omówionymi wcześniej w tym dokumencie.
Tworzenie Połączenie bazy danych — po utworzeniu pliku bazy danych SQLite można utworzyć obiekt połączenia w celu uzyskania dostępu do danych. Połączenie jest konstruowane przy użyciu parametry połączenia, który ma formę Data Source=file_path
, jak pokazano poniżej:
var connection = new SqliteConnection ("Data Source=" + dbPath);
connection.Open();
// do stuff
connection.Close();
Jak wspomniano wcześniej, połączenie nigdy nie powinno być ponownie używane w różnych wątkach. Jeśli masz wątpliwości, utwórz połączenie zgodnie z potrzebami i zamknij je po zakończeniu; ale należy pamiętać o robieniu tego częściej niż jest to wymagane.
Tworzenie i wykonywanie polecenia bazy danych — po nawiązaniu połączenia możemy wykonać na nim dowolne polecenia SQL. Poniższy kod przedstawia wykonywaną instrukcję CREATE TABLE
.
using (var command = connection.CreateCommand ()) {
command.CommandText = "CREATE TABLE [Items] ([_id] int, [Symbol] ntext, [Name] ntext);";
var rowcount = command.ExecuteNonQuery ();
}
Podczas wykonywania kodu SQL bezpośrednio w bazie danych należy podjąć normalne środki ostrożności, aby nie wysyłać nieprawidłowych żądań, takich jak próba utworzenia tabeli, która już istnieje. Śledź strukturę bazy danych, aby nie powodować SqliteException
, że tabela błędów SQLite [Items] już istnieje.
Podstawowy dostęp do danych
Przykładowy kod DataAccess_Basic dla tego dokumentu wygląda następująco podczas uruchamiania w systemie Android:
Poniższy kod ilustruje sposób wykonywania prostych operacji SQLite i przedstawia wyniki w postaci tekstu w oknie głównym aplikacji.
Należy uwzględnić następujące przestrzenie nazw:
using System;
using System.IO;
using Mono.Data.Sqlite;
Poniższy przykładowy kod przedstawia całą interakcję z bazą danych:
- Tworzenie pliku bazy danych
- Wstawianie niektórych danych
- Wykonywanie zapytań dotyczących danych
Te operacje zwykle pojawiają się w wielu miejscach w całym kodzie, na przykład można utworzyć plik bazy danych i tabele, gdy aplikacja po raz pierwszy uruchamia i wykonuje odczyty i zapisy danych na poszczególnych ekranach w aplikacji. W poniższym przykładzie pogrupowano je w jedną metodę dla tego przykładu:
public static SqliteConnection connection;
public static string DoSomeDataAccess ()
{
// determine the path for the database file
string dbPath = Path.Combine (
Environment.GetFolderPath (Environment.SpecialFolder.Personal),
"adodemo.db3");
bool exists = File.Exists (dbPath);
if (!exists) {
Console.WriteLine("Creating database");
// Need to create the database before seeding it with some data
Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath);
connection = new SqliteConnection ("Data Source=" + dbPath);
var commands = new[] {
"CREATE TABLE [Items] (_id ntext, Symbol ntext);",
"INSERT INTO [Items] ([_id], [Symbol]) VALUES ('1', 'AAPL')",
"INSERT INTO [Items] ([_id], [Symbol]) VALUES ('2', 'GOOG')",
"INSERT INTO [Items] ([_id], [Symbol]) VALUES ('3', 'MSFT')"
};
// Open the database connection and create table with data
connection.Open ();
foreach (var command in commands) {
using (var c = connection.CreateCommand ()) {
c.CommandText = command;
var rowcount = c.ExecuteNonQuery ();
Console.WriteLine("\tExecuted " + command);
}
}
} else {
Console.WriteLine("Database already exists");
// Open connection to existing database file
connection = new SqliteConnection ("Data Source=" + dbPath);
connection.Open ();
}
// query the database to prove data was inserted!
using (var contents = connection.CreateCommand ()) {
contents.CommandText = "SELECT [_id], [Symbol] from [Items]";
var r = contents.ExecuteReader ();
Console.WriteLine("Reading data");
while (r.Read ())
Console.WriteLine("\tKey={0}; Value={1}",
r ["_id"].ToString (),
r ["Symbol"].ToString ());
}
connection.Close ();
}
Bardziej złożone zapytania
Ponieważ sqLite umożliwia uruchamianie dowolnych poleceń SQL względem danych, można wykonać dowolne CREATE
instrukcje , INSERT
, UPDATE
, DELETE
lub.SELECT
Informacje o poleceniach SQL obsługiwanych przez sqlite można przeczytać w witrynie internetowej SQLite. Instrukcje SQL są uruchamiane przy użyciu jednej z trzech metod na SqliteCommand
obiekcie:
ExecuteNonQuery — zwykle używany do tworzenia tabeli lub wstawiania danych. Wartość zwracana dla niektórych operacji to liczba wierszy, których dotyczy problem, w przeciwnym razie wynosi -1.
ExecuteReader — używany podczas zwracania kolekcji wierszy jako
SqlDataReader
.ExecuteScalar — pobiera pojedynczą wartość (na przykład agregację).
EXECUTENONQUERY
INSERT
instrukcje , UPDATE
i DELETE
zwracają liczbę wierszy, których dotyczy problem. Wszystkie inne instrukcje SQL będą zwracać wartość -1.
using (var c = connection.CreateCommand ()) {
c.CommandText = "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('1', 'APPL')";
var rowcount = c.ExecuteNonQuery (); // rowcount will be 1
}
EXECUTEREADER
Poniższa metoda przedstawia klauzulę WHERE
w instrukcji SELECT
.
Ponieważ kod tworzy pełną instrukcję SQL, należy zadbać o ucieczkę znaków zarezerwowanych, takich jak cudzysłów (') wokół ciągów.
public static string MoreComplexQuery ()
{
var output = "";
output += "\nComplex query example: ";
string dbPath = Path.Combine (
Environment.GetFolderPath (Environment.SpecialFolder.Personal), "ormdemo.db3");
connection = new SqliteConnection ("Data Source=" + dbPath);
connection.Open ();
using (var contents = connection.CreateCommand ()) {
contents.CommandText = "SELECT * FROM [Items] WHERE Symbol = 'MSFT'";
var r = contents.ExecuteReader ();
output += "\nReading data";
while (r.Read ())
output += String.Format ("\n\tKey={0}; Value={1}",
r ["_id"].ToString (),
r ["Symbol"].ToString ());
}
connection.Close ();
return output;
}
Metoda ExecuteReader
zwraca obiekt SqliteDataReader
. Oprócz metody pokazanej Read
w przykładzie inne przydatne właściwości to:
Wiersze, których dotyczy problem — liczba wierszy, których dotyczy zapytanie.
HasRows — czy zostały zwrócone jakiekolwiek wiersze.
EXECUTESCALAR
Użyj tej funkcji dla SELECT
instrukcji, które zwracają pojedynczą wartość (na przykład agregację).
using (var contents = connection.CreateCommand ()) {
contents.CommandText = "SELECT COUNT(*) FROM [Items] WHERE Symbol <> 'MSFT'";
var i = contents.ExecuteScalar ();
}
Zwracany ExecuteScalar
typ metody to object
— należy rzutować wynik w zależności od zapytania bazy danych. Wynikiem może być liczba całkowita z COUNT
zapytania lub ciągu z zapytania z jedną kolumną SELECT
. Należy pamiętać, że różni się to od innych Execute
metod, które zwracają obiekt czytelnika lub liczbę wierszy, których dotyczy problem.