[JAVA] Da ich es oft benutze, notiere ich mir DB-bezogene Dinge auf Android.

Einführung

Dies ist ein Memo, also hab keine Angst.

1. Vererbung, Konstanten und Generierung von DB-Dateien

Es gibt vier Spalten (horizontale Achse): `ID (automatisch generiert)`, Kategorie```, Kapitel```, Passwort```. Der Dateiname lautet ProjectList.db``` und der Tabellenname lautet `` PROJECT_INFO```

SampleDatabaseHelper


public class SampleDatabaseHelper extends SQLiteOpenHelper {
    // Reference
    private static final String TAG = "SampleDatabaseHelper";
    //Tabellenname
    private static final String TABLE_PROJECT = "PROJECT_INFO";
    //Säule
    public static final String ID = "_id";
    public static final String CATEGORY = "category";
    public static final String CHAPTER = "chapter";
    public static final String PASSWORD = "password";

    //Alle Spalten
    private final String[] PROJECT_COLUMNS = { CATEGORY, CHAPTER, PASSWORD };
    
    //SQlite-Produktionstext
    private static final String SQL_CREATE_TABLE_PROJECT = "CREATE TABLE "
            + "`" + TABLE_PROJECT + "` ("
              + "`" + ID + "`	INTEGER PRIMARY KEY AUTOINCREMENT,"
              + "`" + CATEGORY + "`    TEXT NOT NULL,"
              + "`" + CHAPTER + "`    TEXT NOT NULL,"
              + "`" + PASSWORD + "`,"
              + "UNIQUE("
                + "`" + CATEGORY + "`,"
                + "`" + CHAPTER + "`,"
                + "`" + PASSWORD + "`"
              + ")"
            + ");";

    //Definition des Dateinamens und der Versionsnummer
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_FILE_NAME = "ProjectList.db";

    //Konstrukteur
    public SampleDatabaseHelper (Context context) {
        super(context, DATABASE_FILE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate (SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(SQL_CREATE_TABLE_PROJECT);
    }

    @Override
    public void onUpgrade (SQLiteDatabase sqLiteDatabase, int i, int i1) { }
}

[Referenz] SQLite-Tabellenerstellungsbefehl

CREATE TABLE `PROJECT_INFO`(
`_id` INTEGER PRIMARY KEY AUTOINCREMENT,
`category` TEXT NOT NULL,
`chapter` TEXT NOT NULL,
`password`,
UNIQUE(`category`, `chapter`, `password`));

Tabellenname nach CREATE TABLE. In () trennen Sie , in der Reihenfolge `Spaltentypregel`. Zu den Regeln gehören "PRIMARY KEY", der den Primärschlüssel "AUTOINCREMENT" angibt, der beim Hinzufügen einer Zeile automatisch den Wert um 1 generiert, und "NOT NULL", der nicht absolut leer sein darf. Gibt es. Außerdem können die Werte von Spalten, die in "EINZIGARTIG" eingeschlossen sind, nicht dieselbe Kombination wie andere Zeilen sein.

2. Registrierungsmethode

SampleDatabaseHelper


    public boolean addProject(final String category, final String chapter, final String password) {
        try{
            SQLiteDatabase db = getReadableDatabase();
            final ContentValues values = new ContentValues(3);
            values.put(CATEGORY,category);
            values.put(CHAPTER,chapter);
            values.put(PASSWORD,password);
            long rowID = db.insert(TABLE_PROJECT,null,values);
            if (rowID >= 0) {
                //Erfolgreiche Registrierung.
                return true;
            } else {
                //Registrierung fehlgeschlagen. In vielen Fällen liegt die Ursache darin, dass der Zustand von UNIQUE abgefangen wird.
                return false;
            }
        } catch (Exception e) {
            return false;
        }
    }

3. Zeile löschen

SampleDatabaseHelper


    public int deleteProject(String id){
        String selection = ID + " = ?";
        String[] selectionArgs = { id };
        try {
            SQLiteDatabase db = getWritableDatabase();
            int deletedId = db.delete(TABLE_PROJECT, selection, selectionArgs);
            return deletedId;
        } catch (Exception e) {}
    }

selection ist eine bedingte Anweisung, mit der SQLite geschrieben wird. In diesem Fall gibt es nur ein ? , Aber selbst wenn es mehrere ? Gibt, wird der Inhalt von selectionArgs nacheinander auf ? Angewendet.

4. Zeilensuche

SampleDatabaseHelper


    public List<String[]> getProjectColumns(String category){
        String selection = CATEGORY + " = ?";
        String[] selectionArgs = { category };
        Cursor c = null;
        try {
            SQLiteDatabase db = getReadableDatabase();
            c = db.query(TABLE_PROJECT, PROJECT_COLUMNS, selection, selectionArgs, null, null, null);
            List<String[]> list = new ArrayList<>();
            while (c.moveToNext()) {
                String[] ret = { c.getString(0), c.getString(1), c.getString(2) };
                list.add(ret);
            }
            return list;
        }catch (Exception e) {

        } finally {
            if (c != null) {
                try { c.close(); } catch (Exception ex) {}
            }
        }
        return null;
    }

Beachten Sie das Konzept der Cursor. Diejenigen, die die Suche treffen, während es viele Spalten gibt, werden markiert und extrahiert. In diesem Zustand ist alles markiert, aber wenn Sie `c.moveToNext ()` ausführen, bewegt sich der Cursor nur zum obersten der ** extrahierten **. (Wenn Sie es noch einmal tun, wird ** unter den extrahierten ** als nächstes angezeigt.) Sie können dies verwenden, um sicherzustellen, dass der Wert darin enthalten ist.

[Beispiel] Suche nach Spalten anhand der ID

SampleDatabaseHelper


    public String[] getProjectColumns(String id) {
        String selection = ID + " = ?";
        String[] selectionArgs = { id };
        Cursor c = null;
        try {
            SQLiteDatabase db = getReadableDatabase();
            c = db.query(TABLE_PROJECT,PROJECT_COLUMNS, selection, selectionArgs, null, null, null);
            if (c.moveToNext()) {
                String[] ret = {c.getString(0),c.getString(1),c.getString(2)};
                return ret;
            }
        } catch (Exception e) {
        } finally {
            if (c != null) {
                try { c.close(); } catch (Exception ex) {}
            }
        }
        return null;
    }

5. Leitungsaktualisierung

    public boolean updateColumns(String id, String newCategory, String newChapter, String newPassword){
        String selection = ID + " = ?";
        String[] selectionArgs = { id };
        try {
            SQLiteDatabase db = getReadableDatabase();
            final ContentValues updateValues = new ContentValues(3);
            updateValues.put(CATEGORY,newCategory);
            updateValues.put(CHAPTER,newChapter);
            updateValues.put(PASSWORD,newPassword);
            db.update(DATABASE_PROJECT_NAME, updateValues, selection, selectionArgs);
            return true;
        }catch (Exception e) {
            return false;
        }
        return false;
    }

Zusammenfassung

Es ist nur ein Memo. Wenn Sie mir also die Schreibweise sagen, werde ich es korrigieren. Ich habe die Methodenspezifikationen als Unternehmensstandard geschrieben. Obwohl es japanisch ist. Twitter: https://twitter.com/Cyber_Hacnosuke (Bitte folgen Sie mir.) Github: https://github.com/CyberHacnoshuke

Recommended Posts

Da ich es oft benutze, notiere ich mir DB-bezogene Dinge auf Android.
[Java-Anfänger] Ich habe ein etwas tieferes Verständnis von "Es ist Zeit, neue zu verwenden", also machen Sie sich eine Notiz
Notieren Sie sich die Ruby-Schlüsselwortargumente
Ich habe eine Taschenrechner-App für Android erstellt
Ich wollte eine Diashow des Hintergrundbilds erstellen, da das Bild des Sperrbildschirms von Windows 10 wunderschön ist
Ich habe versucht, die DB-Zugriffsanwendung unter IKS + Db2 in IBM Cloud auszuführen (6. Vorbereitung der DB-Zugriffsanwendung (Java)).
Kintone-Klon? Ich war ziemlich süchtig danach, die OSS WebDB-Erweiterung mit Lightsail + Docker zu starten. Notieren Sie sich dies.
Ich möchte NetBeans auf einem Mac verwenden → Ich kann es verwenden!
Ich habe den lesbaren Code gelesen, machen Sie sich also eine Notiz
[Android Studio] Ich möchte eine Maven-Bibliothek unter Android verwenden
Ich habe eine Bibliothek zum Anzeigen von Tutorials auf Android erstellt.
Ein problematischer Hinweis beim Versuch, nginx mit Remote-Containern von vscode zu verwenden
Der Artikel für Neuankömmlinge hat mich inspiriert. Notieren Sie ihn sich, damit Sie Ihre ursprünglichen Absichten nicht vergessen.