Hallo erstmal, ich bin neu hier und hoffe, den richtigen Bereich gefunden zu haben.
Zu meinem Problem: Zum experimentieren mit Datenbanken habe ich mir das Buzzword-Bingo aus einem c't Sonderheft über Android runtergeladen. Dort werden nun einzelne Wörter direkt im Code in die Datenbank eingegeben, ich möchte diese Wörter aber (zum späteren lokalisieren und um was zu lernen) in ein Array in der strings.xml packen. Wenn ich das mache, bekomme ich leider einen OutOfMemory Fehler, da das Array angeblich zu groß sei (gerademal 9 Einträge). Wie kann ich diesen Fehler jetzt beheben, oder bin ich einfach nur zu dumm dafür?
Die Datenbank-Activity (siehe 2. Aufruf) fast unbearbeitet :
package de.menzerath.sibb;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class BBingoDB extends SQLiteOpenHelper {
public final static String MAIN_TABLE="wordlists";
private final static String ID="_id";
public final static String TITLE="title";
private final static String WORDS="words";
public static class WordList {
public long id;
public String title;
public String words;
}
private static final String MAIN_DATABASE_CREATE =
"create table "+MAIN_TABLE
+" (_id integer primary key autoincrement, "
+ TITLE+" text not null,"
+ WORDS+" text not null);";
// Liste von Standard-Wörtern ==> Diese Wörter sollen in die strings.xml
private static final List DEFAULT_WORDS=new ArrayList(
Arrays.asList(
"Android","Architektur",
"Big Picture","Benchmark",
"Context","Core",
"Gadget",
"Hut aufhaben",
"Internet","iPhone",
"Kundenorientiert",
"Mobile irgendwas",
"Netzwerk",
"People","pro-aktiv",
"Qualität",
"Ressourcen","Revolution","Runde drehen",
"Sozial","Synergie",
"Technologie",
"Überall",
"Values","Virtuell","Vision",
"Weltneuheit","Web 2.0","Win-Win",
"Zielführend"));
public BBingoDB(Context ctx) {
super(ctx,MAIN_TABLE, null, 1); // DB Version festlegen, hier 1
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(MAIN_DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public synchronized void close() {
super.close();
}
public WordList getWordList(long id){
Cursor c=null;
try {
c=getReadableDatabase().query(MAIN_TABLE, new String[]{ID,TITLE,WORDS},
ID+"=?", new String[]{String.valueOf(id)}, null,null,null);
if(!c.moveToFirst())
return null;
WordList wordlist=new WordList();
wordlist.id=id;
wordlist.title=c.getString(c.getColumnIndexOrThrow(TITLE));
wordlist.words=c.getString(c.getColumnIndexOrThrow(WORDS));
return wordlist;
}
finally {
if (c != null)
c.close();
}
}
public long setWordList(WordList wordlist) {
ContentValues values=new ContentValues();
if(wordlist.id!=0)
values.put(ID, wordlist.id);
values.put(TITLE, wordlist.title);
values.put(WORDS, wordlist.words);
if(wordlist.id==0) {
wordlist.id=getWritableDatabase().insert(MAIN_TABLE,null,values);
}
else {
getWritableDatabase().update(MAIN_TABLE, values,
ID+"=?", new String[]{String.valueOf(wordlist.id)});
}
return wordlist.id;
}
/**
* Lege Standard-(Beispiel)Wortliste an
* @return id der gespeicherten Wortliste
*/
public long createDefaultWordList()
{
return setWordList(getDefaultWordList());
}
private WordList getDefaultWordList() {
WordList wordlist = new WordList();
wordlist.title = "IT";
wordlist.words = listToString(DEFAULT_WORDS);
return wordlist;
}
/**
* Liefere ID der ersten gespeicherten Wortliste zur�ck,
* als Fallback, falls die aktuelle Wortliste nicht mehr existiert
* @return ID der Wortliste oder 0 falls Tabelle leer
*/
public long getFirstWordListID() {
Cursor c = null;
try {
c = getReadableDatabase().query(MAIN_TABLE, new String[] { ID },
null, null, null, null, null, null);
if (c.moveToFirst())
return c.getLong(c.getColumnIndexOrThrow(ID));
else
return 0;
} finally {
if (c != null && !c.isClosed()) {
c.close();
}
}
}
/**
* Zugriff auf alle Wortlisten, sortiert nach Titel
* @return Cursor �ber die Daten, Aufrufer muss Cursor selbst schlie�en
*/
public Cursor getWordListsCursor() {
return getReadableDatabase().query(MAIN_TABLE, new String[]{ID,TITLE},
null, null, null,null,
TITLE+" COLLATE LOCALIZED"); // sortiere nach Titel, Sortierreihenfolge der aktuellen Sprache
}
public void removeWordList(long id) {
getWritableDatabase().delete(MAIN_TABLE, "_id=" + id, null);
}
// Hilfsfunktionen zur Konvertierung von Java-Listen in \n-getrennte Strings und umgekehrt
public static String listToString(List list)
{
Iterator iter = list.iterator();
StringBuffer words=new StringBuffer(iter.next());
while(iter.hasNext())
words.append("\n").append(iter.next());
return words.toString();
}
public static List stringToList(String string)
{
return Arrays.asList(string.split("\n"));
}
}
Wenn ich diesen wichtigen Teil jetzt jedoch durch dies ersetze:
private static final List DEFAULT_WORDS=new ArrayList(R.array.Words1);
Bekomme ich den bekannten OutOfMemory-Fehler.
Die strings.xml Datei (der wichtige Ausschnitt):
<string-array
name="Words1">
<item>Mathematik</item>
<item>Hausaufgabe</item>
<item>Füller</item>
<item>Nachsitzen</item>
<item>Raus!</item>
<item>Pizza</item>
<item>Pause</item>
<item>Richtig</item>
<item>Falsch</item>
</string-array>
Wie man jetzt sieht, habe ich bereits Wörter geändert, da meine Version zu einem "School Is Boring! Bingo" werden soll.
Schon jetzt einmal vielen Dank an alle, die mir weiterhelfen können!
PS: Wer mir außerdem sagen kann, wie ich weitere Listen direkt mit der App ausliefern kann, hilft mir auch sehr viel weiter!