Hur skapar jag en databas till min Android-app?

Trädvy Permalänk
Medlem
Registrerad
Okt 2016

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

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2004

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

Dator 1: 6700k | 970 GTX | 2x8gb | 1xSamsung Evo 850
Dator 2: i7 930 | 7970 | 3x2048 | 1xIntel 80gb SSD
Dator 3: Q9550 | 5850 | 4x2048 PC2-8500 | 1xSamsung Evo 830, 2x1TB, 1x750GB

Trädvy Permalänk
Medlem
Registrerad
Okt 2016

@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".

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2004

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....

Dator 1: 6700k | 970 GTX | 2x8gb | 1xSamsung Evo 850
Dator 2: i7 930 | 7970 | 3x2048 | 1xIntel 80gb SSD
Dator 3: Q9550 | 5850 | 4x2048 PC2-8500 | 1xSamsung Evo 830, 2x1TB, 1x750GB

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009

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

@AnnaHoff

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.

Trädvy Permalänk
Medlem
Registrerad
Okt 2016

@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

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2009

@AnnaHoff
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

Trädvy Permalänk
Medlem
Registrerad
Sep 2016
Skrivet av AnnaHoff:

@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.