Hur skapar jag en databas till min Android-app?

Permalänk

Hur skapar jag en databas till min Android-app?

Hej

Jag är helt rudis på att programmera för Android men har nu gett mig in på att försöka knåpa ihop en app. Jag har utgått ifrån tutorials (https://developer.android.com/training/basics/data-storage/da...) men förstår inte riktigt vad jag håller på med. Mina java-kunskaper är från 1997 och snudd på oanvända sen dess. Var inte särskilt bra på det då heller men men, skam den som ger sig

Så, det jag vill åstadkomma i det här läget är en app som visar ett text-fält och en knapp (Done) och när jag trycker på knappen så sparas texten ner i min databas. I dagsläget så skrivs texten ut på en annan sida (se tidigare steg i tutorialen).

Min fråga är om någon kan begripligt beskriva hur jag skapar min databas och hur jag sparar min text i den.

Med hopp om hjälp!
MVh
Anna Hoff

Permalänk
Medlem

Det beror helt på vad du ska göra med datan senare. Men i detta caset så vill du accessa datan från en annan applikation (den andra sidan) och därför är det rekommenderat att lägga datan på en plats där alla applikationer kan nå den. Till exempel på en server (din hemmaburk?).

För att kommunicera med databasen kan du använda olika typer av gränssnitt och eller ramverk. Men ett tips är att du sätter upp en enklare data storage-lösning för detta och inte en relationsdatabas. En som du kan kommunicera med över REST (vanlig teknik för kommunikation mellan web-appar och mobil-appar osv). Ett förslag är hazelcast.

Installera alltså denna på din lokala maskin och sätt sedan upp REST-anrop mot den i appen för att lagra respektive hämta data. Exakt hur du gör det beror på vad du kan för tekniker sedan tidigare. Så väljer att svara på själva databas-delen och lämna resten till dig att välja/lära eller fråga vidare om

Visa signatur

Dator 1: 5800x | 4070 GTX | 2x16gb | 1xSamsung 980 Pro 2TB NVME
Dator 2: 9700k | 1080 GTX | 2x8gb | 1xSamsung Pro NVME
Dator 3: 6700k | 1070 GTX | 2x8gb | 1xSamsung Evo 830, 2x1TB, 1x750GB

Permalänk

@Da MusH:

Mja, jag hade nog tänkt att appen skall gå att använda i offline-läge och då tänker jag att databasen skall ligga på telefonen "i appen".

Permalänk
Medlem

Ja då kan du inte lägga den på en server. Men om du ska nå informationen från någon annan applikation så måste ju denna fråga mobiltelefonen. Hur som helst så hittade jag en bra guide som förklarar bättre utifrån vilka behov du har:

https://developer.android.com/guide/topics/data/data-storage....

Visa signatur

Dator 1: 5800x | 4070 GTX | 2x16gb | 1xSamsung 980 Pro 2TB NVME
Dator 2: 9700k | 1080 GTX | 2x8gb | 1xSamsung Pro NVME
Dator 3: 6700k | 1070 GTX | 2x8gb | 1xSamsung Evo 830, 2x1TB, 1x750GB

Permalänk
Medlem

@Da MusH: Med annan sida så tror jag hen menar en annan activity/fragment/view

@Hasselnöt

Beror lite på vad du ska göra, ska du bara spara någon liten grej kan du spara denna i SharedPreferences som tutorialen gick igenom.

Annars finns exempelvis Realm

Om du vill ha en molnbaserad lösning finns Firebase som är väldigt lätt att använda och komma igång med, med bra tutorials. Där finns även andra saker du kan använda som hantering av användare, authentication, notificationer med mera.

Permalänk

@Da MusH: Tack för länken men det är just den tutorialen som jag fightas med just nu.

@NoToes: Ja, det är nog activity jag menar (Har inte full koll på vokabulären än)
SharedPreferences kanske funkar nu men i slutändan kommer det bli rätt komplext och då tror jag en databas är bästa lösningen. Realm såg intressant ut, tack. Får studera det lite närmre. Molnbaserat får bli en framtida lösning

Har även hittat denna tutorial som jag testar nu:http://mobilesiri.com/android-sqlite-database-tutorial-using-android-studio/
Men det är inte helt lätt att få det att köra

Just nu ser mina klasser ut såhär:
MainActivity.java:
package se.anna.thepile;

import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
public final static String EXTRA_MESSAGE = "se.anna.thepile";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

/**
* Called when the user clicks the Add Task button
*/
public void addTask(View view) {
EditText editText = (EditText) findViewById(R.id.task_description);
String myTask = editText.getText().toString();
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, myTask); // Task Name
// Inserting Row
db.insert(TABLE_NAME, null, values);
db.close(); // Closing database connection
}
}

DBHandler.java:
package se.anna.thepile;

import android.app.ActivityManager;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHandler extends SQLiteOpenHelper {

// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "thepile";
// Contacts table name
private static final String TABLE_NAME = "tasks";
// Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_NAME = "aTask";
public DBHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_NAME + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + ")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
// Creating tables again
onCreate(db);
}
}

Nuvarande felmeddelande: Error:(28, 37) error: cannot find symbol method getWritableDatabase()

Några tips?

/Anna

Permalänk
Medlem

@Hasselnöt
Skriv din kod innanför [ code ]kodhär[/code] utan mellanslag innanför [ ] så blir det mycket lättare att läsa, se till att indentera ordentligt bara

Såhär

I din

public class MainActivity extends AppCompatActivity { public final static String EXTRA_MESSAGE = "se.anna.thepile"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

Så måste du först skapa en DBHandler och spara den i en variabel, därefter kan du använda den eftersom

SQLiteDatabase db = this.getWritableDatabase();

I din MainActivity kollar efter en metod som heter getWritableDatabase i MainActivity, när den i själva verket ligger i klassen DBHandler.

public class MainActivity extends AppCompatActivity { public final static String EXTRA_MESSAGE = "se.anna.thepile"; private DBHandler db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db = new DBHandler(); }

Här kan du få en bättre överblick över filerna i hans exempel. Alternativt kan du hämta hela projektet här som borde vara körbart

Permalänk
Medlem
Skrivet av Hasselnöt:

@Da MusH:

Mja, jag hade nog tänkt att appen skall gå att använda i offline-läge och då tänker jag att databasen skall ligga på telefonen "i appen".

Jag brukar använda SQLite om jag vill ha databasen på telefonen dvs om det är relativt små mängder data man ska hantera. Finns många enkla tutorials. Sitter på jobbet så jag hinner tyvärr inte leta på ett och länka men det finns.

Visa signatur

i7 7700k @4.7ghz - 16gb ram @3000mhz - 8gb RTX 3070 - Acer 34 ed347ckr 100hz - Oculus Quest2