2014-07-07 13 views
23

Stworzyłem tabelę dla mojego ContentProvider stosując następujący wiersz:Jak dodać logiczna kolumna w Android SQLite

static final String CREATE_DB_TABLE = 
    " CREATE TABLE " + CONTACTS_TABLE_NAME + 
    " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
    " pid TEXT NOT NULL, " + 
    " name TEXT NOT NULL,"+ 
    "number TEXT NOT NULL);"; 

Posiada 4 kolumny. Teraz chcę dodać kolumnę z wartością logiczną true/false. Jak mogę dodać dodać/zmienić to oświadczenie, czy mam dodać kolumnę logiczna nazwie „status” .

+8

SQLite nie posiada oddzielną klasę pamięci logicznej. Zamiast tego wartości logiczne są przechowywane jako liczby całkowite 0 (fałsz) i 1 (prawda). Sprawdź to [Post] (http://stackoverflow.com/questions/843780/store-boolean-value-in-sqlite) –

+0

Chcesz powiedzieć, że '' status INTEGER NOT NULL ",' ??? –

+0

ya dokładnie ..... –

Odpowiedz

52

Można użyć coś takiego:

Utwórz tabelę:

static final String CREATE_DB_TABLE = 
    "CREATE TABLE " + CONTACTS_TABLE_NAME " + 
    " (_id INTEGER PRIMARY KEY AUTOINCREMENT," + 
    "..." + " flag INTEGER DEFAULT 0)"; 

odzyskać swoją wartość jako:

Boolean flag = (cursor.getInt(cursor.getColumnIndex("flag")) == 1); 
+0

plz wziąć łup w tym poście ,,, m czeka na odpowiedź przez ostatnie 3 dni, ni nawet nie dostał ani jednego komentarza ... http: //stackoverflow.com/questions/24733444/how-to-use- dwu-kursor-kursor-joiner-in-loadermanager-in-android –

+0

Niestety, nic nie wiem o 'CursorJoiner' i' LoaderManager', ponieważ ich nie używam. Moja sugestia jest ... czy nie możesz ** JOIN ** (lub chcesz zrobić ** UNION **?) Dwie tabele bezpośrednio w jednym zapytaniu? –

+0

'CursorJoiner' faktycznie łączy dwa kursory. Ale muszę wywołać to za pomocą LoaderManager coz zapytuje automatycznie ContentProvider. Muszę odzwierciedlić zmiany w czasie wykonywania i nie mogę sobie pozwolić na ponowne wysyłanie zapytań. –

8

Jak wspomniano M D

SQLite nie wyodrębnia pamięci logicznej. Zamiast tego Wartości logiczne są przechowywane jako liczby całkowite 0 (fałsz) i 1 (prawda).

Poniższa ALTER -

ALTER TABLE CREATE_DB_TABLE ADD status boolean NOT NULL default 0; 

Następnie można użyć kursora, aby uzyskać żądaną wartość, a następnie przekonwertować do rzeczywistej Boolean -

flag=cursor.getString(0).equals("1") 

Możesz użyć tej flagi, aby wyświetlić na ekranie użytkownika.

referencyjny: http://www.sqlite.org/datatype3.html

+1

Cóż, prawdopodobnie użyłbym 'return c.getShort (index) == 1;' zamiast tego. –

1
public enum Status{ 
     TRUE,FALSE; 
} 
static final String CREATE_DB_TABLE = 
    " CREATE TABLE " + CONTACTS_TABLE_NAME + 
    " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +...... 
    " booleanColumn INTEGER DEFAULT 0);"; 

// podczas wkładania

przejścia Status.TRUE.ordinal() wartości do bazy danych i

// podczas pobierania

krzyż check z wartością porządkową dla statusu

0

Sqlite nie przewiduje żadnej klasy do przechowywania wartości logicznych.

Można użyć 0 dla false i 1 dla true. Konieczne będzie przekonwertowanie tych wartości po pobraniu ich z bazy danych.

0

niestety android sqlite nie obsługuje typu Boolean i Integer należy użyć zamiast niego