Hey
vielen vielen Dank
es hat wunderbar geklappt...
Das war die Lösung und ich wäre alleine glaube ich nie drauf gekommen
Also vielen Dank noch mal
LG
Marco
Hey
vielen vielen Dank
es hat wunderbar geklappt...
Das war die Lösung und ich wäre alleine glaube ich nie drauf gekommen
Also vielen Dank noch mal
LG
Marco
Hey danke schon mal für die Tipps und die Zeit die du dir genommen hast
Ich blicke da aber noch nicht ganz durch und habe noch ein paar Fragen
Für was bracht man den Übergabeparameter? Was übergibt er und wo für? Wie benutze ich ihn, also wie implementiere ich in im Java Quell Text?
Es wäre super wenn du mir diese paar Fragen noch beantworten könntest
Vielen Dank noch mal
LG
Marco
Hey Matthias danke für die schnelle Antwort
das verstehe ich aber nicht ganz. Ich dachte einfach, dass die Methode aufgerufen wird wenn die Version hoch gesetzt wird. Das klappt ja auch bei mir. Und dann habe ich folgendes gemacht: (Ich schreibe jetzt mal den gesamten Quellcode meiner DB hier rein):
public class BerechnerDbAdapter {
private onUpgradeHelper helper;
private static final String DATABASE_NAME = "data";
private static final String DATABASE_TABLE = "berechner";
private static final String DATABASE_TABLE2 = "database";
private final int DATABASE_VERSION = 2;
public static final String KEY_ROWID = "_id";
public static final String KEY_PREISLITER = "PreisProLiter";
public static final String KEY_PREIS = "Preis";
public static final String KEY_LITER = "Liter";
public static final String KEY_KM = "KM";
public static final String KEY_DATUM = "Datum";
public static final String KEY_YEAR = "mwaka";
public static final String KEY_MONTH = "mwezi";
public static final String KEY_DAY = "siku";
public static final String KEY_HOUR = "saa";
public static final String KEY_MINUTE = "dakika";
public static final String KEY_SECOND = "pili";
//rawQuery Strings:
public static final String SQLLiterSumme = "SELECT SUM(" + KEY_LITER + ") FROM " + DATABASE_TABLE2 + " WHERE " + KEY_YEAR + " = 2012 GROUP BY " + KEY_MONTH + " ORDER BY " + KEY_MONTH + ";";
public static final String SQLLiterGesammt = "SELECT SUM(" + KEY_LITER + ") FROM " + DATABASE_TABLE2 + " WHERE " + KEY_YEAR + " = 2012;";
public static final String SQLKostenSumme = "SELECT SUM(" + KEY_PREIS + ") FROM " + DATABASE_TABLE2 + " WHERE " + KEY_YEAR + " = 2012 GROUP BY " + KEY_MONTH + " ORDER BY " + KEY_MONTH + ";";
public static final String SQLKostenGesammt = "SELECT SUM(" + KEY_PREIS + ") FROM " + DATABASE_TABLE2 + " WHERE " + KEY_YEAR + " = 2012;";
//Kalender Strings:
private Calendar mCalendar;
private static final String DATE_FORMAT = "dd.MM.yyyy";
private static final String TIME_FORMAT = "kk:mm";
private static final String DATE_TIME_FORMAT = "dd.MM.yyyy kk:mm:ss";
private static final String HOUR_FORMAT = "kk";
private static final String MINUTE_FORMAT = "mm";
private static final String YEAR_FORMAT = "yyyy";
private static final String MONTH_FORMAT = "MM";
private static final String DAY_FORMAT = "dd";
private static final String SECOND_FORMAT = "ss";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + " ("
+ KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ KEY_PREISLITER + " TEXT NOT NULL, "
+ KEY_LITER + " TEXT NOT NULL, "
+ KEY_PREIS + " TEXT NOT NULL, "
+ KEY_KM + " TEXT NOT NULL, "
+ KEY_DATUM + " TEXT NOT NULL);";
private static final String DATABASE2_CREATE = "create table " + DATABASE_TABLE2 + " ("
+ KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ KEY_LITER + " REAL, "
+ KEY_PREIS + " REAL, "
+ KEY_KM + " REAL, "
+ KEY_YEAR + " INTEGER, "
+ KEY_MONTH + " INTEGER, "
+ KEY_DAY + " INTEGER, "
+ KEY_HOUR + " INTEGER, "
+ KEY_MINUTE + " INTEGER, "
+ KEY_DATUM + " TEXT NOT NULL, "
+ KEY_SECOND + " INTEGER);";
private final Context mCtx;
public BerechnerDbAdapter(Context ctx){
this.mCtx = ctx;
}
public BerechnerDbAdapter open() throws SQLException{
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close(){
mDbHelper.close();
}
public long createBerechner(String PreisProLiter, String Liter, String Preis, String km, String Datum){
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_PREISLITER, PreisProLiter);
initialValues.put(KEY_PREIS, Preis);
initialValues.put(KEY_LITER, Liter);
initialValues.put(KEY_KM, km);
initialValues.put(KEY_DATUM, Datum);
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
public boolean deleteBerechner(Long rowId){
if (rowId == null){
return mDb.delete(DATABASE_TABLE, null, null)>0;
}else{
return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null)>0;
}
}
public long createDatabase(Double Liter, Double Preis, Double km, Integer Jahr, Integer Monat, Integer Tag, Integer Stunde, Integer Minute, Integer Sekunde){
ContentValues initialValues = new ContentValues();
String Datum = (Tag + "." + Monat + "." + Jahr + " " + Stunde + ":" + Minute);
initialValues.put(KEY_PREIS, Preis);
initialValues.put(KEY_LITER, Liter);
initialValues.put(KEY_KM, km);
initialValues.put(KEY_YEAR, Jahr);
initialValues.put(KEY_MONTH, Monat);
initialValues.put(KEY_DAY, Tag);
initialValues.put(KEY_HOUR, Stunde);
initialValues.put(KEY_MINUTE, Minute);
initialValues.put(KEY_SECOND, Sekunde);
initialValues.put(KEY_DATUM, Datum);
return mDb.insert(DATABASE_TABLE2, null, initialValues);
}
public boolean deleteDatabase(Long rowId){
if (rowId == null){
return mDb.delete(DATABASE_TABLE2, null, null)>0;
}else{
return mDb.delete(DATABASE_TABLE2, KEY_ROWID + "=" + rowId, null)>0;
}
}
public Cursor fetchAllDatabase(){
return mDb.query(DATABASE_TABLE2, new String[] {KEY_ROWID, KEY_DATUM}, null, null, null, null, KEY_MONTH + ", " + KEY_DAY);
}
public Cursor fetchAllBerechner(){
return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_PREISLITER, KEY_PREIS, KEY_LITER, KEY_KM, KEY_DATUM}, null, null, null, null, null);
}
public Cursor fetchBerechner(long rowId) throws SQLException{
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_PREISLITER, KEY_PREIS, KEY_LITER, KEY_KM, KEY_DATUM}, KEY_ROWID + "=" + rowId, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchLiterSumme () throws SQLException{
Cursor mCursor = mDb.rawQuery(SQLLiterSumme , null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchLiterGesammt () throws SQLException{
Cursor mCursor = mDb.rawQuery(SQLLiterGesammt, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchKostenSumme () throws SQLException{
Cursor mCursor = mDb.rawQuery(SQLKostenSumme , null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchKostenGesammt () throws SQLException{
Cursor mCursor = mDb.rawQuery(SQLKostenGesammt, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchMonate () throws SQLException{
Cursor mCursor = mDb.query(true, DATABASE_TABLE2, new String[] {KEY_MONTH}, KEY_YEAR + " = 2012", null, null, null, KEY_MONTH, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchDatabase(long rowId) throws SQLException{
Cursor mCursor = mDb.query(true, DATABASE_TABLE2, new String[] {KEY_ROWID, KEY_PREIS, KEY_LITER, KEY_KM, KEY_YEAR, KEY_MONTH, KEY_DAY, KEY_HOUR, KEY_MINUTE, KEY_SECOND}, KEY_ROWID + "=" + rowId, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchPreis(){
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_PREIS}, null, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchDatum(){
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_DATUM}, null, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchLiter(){
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_LITER}, null, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchKilometer(){
Cursor mCursor = mDb.query(DATABASE_TABLE, new String[] {KEY_KM}, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchId() {
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID}, null, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchIdDatabase() {
Cursor mCursor = mDb.query(true, DATABASE_TABLE2, new String[] {KEY_ROWID}, null, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public Cursor fetchPreisMonat(){
Cursor mCursor = mDb.query(true, DATABASE_TABLE2, new String[] {KEY_PREIS}, (KEY_DATUM + " < 20120299"), null, null, null, null, null);
return mCursor;
}
public boolean updateBerechner(long rowId, String PreisProLiter, String Preis, String Liter, String km, String Datum){
ContentValues args = new ContentValues();
args.put(KEY_PREIS, Preis);
args.put(KEY_LITER, Liter);
args.put(KEY_KM, km);
args.put(KEY_DATUM, Datum);
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null)>0;
}
public boolean updateDatabase(long rowId, Double Preis, Double Liter, Double km, Integer Jahr, Integer Monat, Integer Tag, Integer Stunde, Integer Minute, Integer Sekunde){
ContentValues args = new ContentValues();
args.put(KEY_PREIS, Preis);
args.put(KEY_LITER, Liter);
args.put(KEY_KM, km);
args.put(KEY_YEAR, Jahr);
args.put(KEY_MONTH, Monat);
args.put(KEY_DAY, Tag);
args.put(KEY_HOUR, Stunde);
args.put(KEY_MINUTE, Minute);
args.put(KEY_SECOND, Sekunde);
return mDb.update(DATABASE_TABLE2, args, KEY_ROWID + "=" + rowId, null)>0;
}
public class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(DATABASE2_CREATE);
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
Log.v("DatabaseHelper", "Datenbank Upgrade von " + oldVersion + " auf " + newVersion);
open();
if (oldVersion < 2 && newVersion == 2) {
Cursor CursorOldTable = fetchId();
CursorOldTable.moveToPosition(-1);
ArrayList<Integer> id = new ArrayList<Integer>();
while (CursorOldTable.moveToNext()) {
id.add(Integer.parseInt(CursorOldTable.getString(0)));
}
CursorOldTable.close();
if (id.size() > 0){
for (int i=0;id.size()>i;i++){
CursorOldTable = fetchLiter();
Double liter = Double.parseDouble(CursorOldTable.getString(i));
CursorOldTable.close();
CursorOldTable = fetchPreis();
Double preis = Double.parseDouble(CursorOldTable.getString(i));
CursorOldTable.close();
CursorOldTable = fetchKilometer();
Double km = Double.parseDouble(CursorOldTable.getString(i));
CursorOldTable.close();
CursorOldTable = fetchDatum();
SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DATE_TIME_FORMAT);
Date date = null;
try{
String dateString = CursorOldTable.getString(i);
date = dateTimeFormat.parse(dateString);
mCalendar.setTime(date);
} catch (ParseException e) {
Log.e("BerechnerActivity", e.getMessage(), e);
}
CursorOldTable.close();
mCalendar.setTime(date);
SimpleDateFormat yearFormat = new SimpleDateFormat(YEAR_FORMAT);
SimpleDateFormat monthFormat = new SimpleDateFormat(MONTH_FORMAT);
SimpleDateFormat dayFormat = new SimpleDateFormat(DAY_FORMAT);
SimpleDateFormat hourFormat = new SimpleDateFormat(HOUR_FORMAT);
SimpleDateFormat minuteFormat = new SimpleDateFormat(MINUTE_FORMAT);
SimpleDateFormat secondFormat = new SimpleDateFormat(SECOND_FORMAT);
Integer Jahr =Integer.parseInt(yearFormat.format(mCalendar.getTime()));
Integer Monat =Integer.parseInt(monthFormat.format(mCalendar.getTime()));
Integer Tag =Integer.parseInt(dayFormat.format(mCalendar.getTime()));
Integer Stunde =Integer.parseInt(hourFormat.format(mCalendar.getTime()));
Integer Minute =Integer.parseInt(minuteFormat.format(mCalendar.getTime()));
Integer Sekunde =Integer.parseInt(secondFormat.format(mCalendar.getTime()));
createDatabase(liter, preis, km, Jahr, Monat, Tag, Stunde, Minute, Sekunde);
}
}
}
}
}
}
}
Alles anzeigen
So und damit kommt die Fehlermeldung "Database is locked" im Log, ohne das überhaupt die nachricht im Log ausgegeben wird, welche eigentlich ganz am Anfang von onUpgrade steht. Und wenn ich das "open()" unter der Log Nachricht in onUpgrade entferne, dann kommt besagte null pointer exception und auch keine Nachricht im Log.
Ich bin ratlos
Irgendetwas mache ich wohl falsch
LG
Marco
Hey
ich möchte meine DB updaten und von einer alten Tabelle in eine neue Werte übernehmen. Dies wollte ich über die Methode onUpgrade machen. Wenn ich jetzt die Version auf 2 hoch setzte und eine Nachricht im Log über Log.v(... ausgeben lasse geht das super. Jetzt möchte ich aber die Werte der alten Tabelle in die neue schreiben mit ein paar formatierungen der Werte. Wenn ich jetzt .getWritableDatabase aufrufe, dann bekomme ich eine Laufzeitfehler mit der Nachricht "Database is locked" im Log. Wenn ich .getWritableDatabase nicht aufrufe bekomme ich eine null pointer exception, was ja klar ist da die DB erst mal geöffnet werden muss.
Was muss ich denn machen, damit die Datenbank nicht gelocked wird oder ist?
Schon mal vielen Dank im voraus
LG
Marco
Hmmm okay danke schon mal aber ich habe keine Ahnung was ich da jetzt machen soll oder wie ich diesen Fehler weg bekomme^^
Lg
Marco
Hi
in der Mail App von Android, welche für Exchange Konten ist oder auch in anderen Apps von Android gibt es in EditTextFeldern so ein kleines rotes Ausrufezeichen. Dieses zeigt einem an, wenn in dem EditText eigentlich was stehen müsste dies aber nicht tut oder wenn etwas falsches drin steht.
[Blockierte Grafik: https://plus.google.com/photos…lbums/5717557528636357425] (https://plus.google.com/photos…lbums/5717557528636357425)
Weiß jemand ob es die Library dafür oder so eine ähnliche gibt?
Und eigentlich könnten wir doch mal alle Librarys hier sammeln.
LG Marco
Hey alle zusammen
ich will in meiner App einen Graphen anzeigen lassen. Auf der x-Achse solle das Datum stehen, welches ich als eigene Spalte in einer SQL Datenbank gespeichert habe als String und zwar wie folgt: dd.mm.yyy kk:mm:ss
Dazu habe ich eine Spalte mit Preisen und eine mit Liter wo ich jeweils auch immer Strings drin stehen habe, aber welche alles eigentlich Double Variablen sind. Ich weiß also ganz sicher, dass ich diese einfach mit Double.parsDouble umwandeln kann. Jetzt wird in der DB ja nicht alles nach Datum gespeichert, sondern es kann sein, dass ich unter dem ersten Primärschlüssel (wird in der Datenbank als int unter dem Namen id gespeichert. Ist auf jeden Fall einzigartig wie es ja auch sein soll) das Datum 07.03.2012 ??.??.?? befindet (Uhrzeit ist nicht wichtig) und unter dem zweiten Primärschlüssel das Datum 03.01.2012. Jetzt will ich diese Daten in meinem GraphView an die x-Achse schreiben und dann natürlich dementsprechend auch die Preise und Liter in dem GraphView anzeigen lassen. Das alles mache ich über den Primärschlüssel, da das Datum sich ja auch mal doppeln könnte und ich es dann nur einmal ausgegeben bekomme, so wie es bei DBs üblich ist. Ich habe also versucht einen Array zu erstellen in dem die Primärschlüssel drin gespeichert sind und diesen Array dann nach Datum sortiert. Dies haut aber nicht ganz hin. Ich habe einen Fehler weiß aber nicht wie ich ihn beheben soll. Außerdem dauert meine Methode bei schon etwas größeren Datensätzen sehr sehr lange was natürlich nicht so toll ist. Ich weiß aber nicht wie ich das besser machen soll, also das ich das irgendwas optimiere und somit eine höhere Geschwindigkeit erreiche. Vielleicht könnt ihr mir ja ein paar Tipps geben. Wäre super lieb.
Hier der Java Quelltext:
package com.marcodeubel.fragments;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import android.database.Cursor;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.GraphView.GraphViewData;
import com.jjoe64.graphview.GraphView.GraphViewSeries;
import com.jjoe64.graphview.LineGraphView;
import com.marcodeubel.kostenmanager.BerechnerDbAdapter;
import com.marcodeubel.kostenmanager.R;
public class GraphFragment extends Fragment {
private BerechnerDbAdapter mDbHelper;
private Calendar mCalendar;
private static final String DATE_FORMAT = "dd.MM.yyyy";
private static final String DATE_FORMAT_NEW = "yyyy.MM.dd";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.graph_fragment, container, false);
}
@Override
public void onStart() {
super.onStart();
mDbHelper = new BerechnerDbAdapter(getActivity());
mDbHelper.open();
mCalendar = Calendar.getInstance();
try {
double spreisarray = getPreisArray(0, true);
double sliterarray = getLiterArray(0, true);
double sdatumarray = getDatumArrayDouble();
GraphViewData[] data = new GraphViewData[((int) spreisarray)];
for(int i=0;i<((int) spreisarray);i++){
data[i] = new GraphViewData(i, getPreisArray(i, false));
}
GraphViewData[] dataliter = new GraphViewData[(int) sliterarray];
for(int i=0;i<(int) sliterarray;i++){
dataliter[i] = new GraphViewData(i, getLiterArray(i, false));
}
GraphViewSeries kosten = new GraphViewSeries("Kosten", Color.rgb(200, 50, 00), data);
GraphViewSeries liter = new GraphViewSeries("Liter", Color.rgb(100, 100, 200), dataliter);
String[] datum =new String[(int) sdatumarray];
for (int i=0;i<(int) sdatumarray;i++){
datum[i] = getDatumArray(i, false);
}
GraphView graphView = new LineGraphView(getActivity(), "Kosten");
graphView.addSeries(kosten);
graphView.addSeries(liter);
graphView.setShowLegend(true);
graphView.setViewPort((int) sliterarray, (int) spreisarray);
graphView.setHorizontalLabels(datum);
LinearLayout layout = (LinearLayout) getActivity().findViewById(R.id.graph1);
layout.addView(graphView);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Double getDatumArrayDouble() throws ParseException{
Double sizeDatumArray = Double.parseDouble(getDatumArray(0, true));
return sizeDatumArray;
}
public ArrayList<Integer> getIdArray() throws ParseException {
SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DATE_FORMAT);
SimpleDateFormat dateFormatNew = new SimpleDateFormat(DATE_FORMAT_NEW);
Cursor cursor = mDbHelper.fetchId();
cursor.moveToPosition(-1);
ArrayList<Integer> id = new ArrayList<Integer>();
while (cursor.moveToNext()) {
id.add(Integer.parseInt(cursor.getString(0)));
}
for (int i=0; i < id.size();i++){
Cursor berechnerfest = mDbHelper.fetchBerechner(id.get(i));
getActivity().startManagingCursor(berechnerfest);
Date datefest = null;
String dateStringfest = (String) berechnerfest.getString(berechnerfest.getColumnIndexOrThrow(BerechnerDbAdapter.KEY_DATUM)).subSequence(0, 10);
datefest = dateTimeFormat.parse(dateStringfest);
mCalendar.setTime(datefest);
String Date2String = (dateFormatNew.format(mCalendar.getTime()));
Date2String = Date2String.replaceAll("\\.", "");
Double Date2 = Double.parseDouble(Date2String);
for (int j=i+1; j < id.size(); j++){
Cursor berechner = mDbHelper.fetchBerechner(id.get(j));
getActivity().startManagingCursor(berechner);
Date date = null;
String dateString = (String) berechner.getString(berechner.getColumnIndexOrThrow(BerechnerDbAdapter.KEY_DATUM)).subSequence(0, 10);
date = dateTimeFormat.parse(dateString);
mCalendar.setTime(date);
Double Date1 = Double.parseDouble(dateFormatNew.format(mCalendar.getTime()).replaceAll("\\.", ""));
if(Date1<Date2){
int help;
help = id.get(j);
id.add(j, id.get(i));
id.add(i, help);
}
}
}
return id;
}
public Double getPreisArray(int z, boolean l) throws ParseException{
Double[] preise = new Double[getIdArray().size()];
for (int i=0;i<getIdArray().size();i++){
Cursor berechner = mDbHelper.fetchBerechner(getIdArray().get(i));
getActivity().startManagingCursor(berechner);
preise[i]=Double.parseDouble(berechner.getString(berechner.getColumnIndexOrThrow(BerechnerDbAdapter.KEY_PREIS)));
}
if (l){
return (double) preise.length;
}else{
return preise[z];
}
}
public Double getLiterArray(int z, boolean l) throws ParseException{
Double[] liter = new Double[getIdArray().size()];
for (int i=0;i<getIdArray().size();i++){
Cursor berechner = mDbHelper.fetchBerechner(getIdArray().get(i));
getActivity().startManagingCursor(berechner);
liter[i]=Double.parseDouble(berechner.getString(berechner.getColumnIndexOrThrow(BerechnerDbAdapter.KEY_LITER)));
}
if (l){
return (double) liter.length;
}else{
return liter[z];
}
}
public String getDatumArray(int z, boolean l) throws ParseException{
String[] datum = new String[getIdArray().size()];
for (int i=0;i<getIdArray().size();i++){
Cursor berechner = mDbHelper.fetchBerechner(getIdArray().get(i));
getActivity().startManagingCursor(berechner);
datum[i]=(berechner.getString(berechner.getColumnIndexOrThrow(BerechnerDbAdapter.KEY_DATUM)).substring(0, 10));
}
if (l){
return String.valueOf(datum.length);
}else{
return datum[z];
}
}
}
Alles anzeigen
Und hier ist der log.txt vom Laufzeitfehler, wenn ich das Fragment aufrufe, mit zwei Einträgen in der DB. Mit einem Eintrag geht es aber die GraphView zeigt mir dann nichts an.
03-08 15:56:23.898: D/dalvikvm(862): GC_CONCURRENT freed 181K, 4% free 9311K/9607K, paused 6ms+5ms
03-08 15:56:25.148: D/dalvikvm(862): GC_CONCURRENT freed 183K, 4% free 9565K/9863K, paused 5ms+8ms
03-08 15:56:26.267: D/dalvikvm(862): GC_CONCURRENT freed 212K, 4% free 9790K/10119K, paused 5ms+12ms
03-08 15:56:27.347: D/dalvikvm(862): GC_CONCURRENT freed 200K, 4% free 9999K/10311K, paused 5ms+13ms
03-08 15:56:28.649: D/dalvikvm(862): GC_CONCURRENT freed 216K, 4% free 10240K/10567K, paused 5ms+21ms
03-08 15:56:29.879: D/dalvikvm(862): GC_CONCURRENT freed 228K, 4% free 10492K/10823K, paused 5ms+21ms
03-08 15:56:30.908: D/dalvikvm(862): GC_CONCURRENT freed 210K, 3% free 10701K/11015K, paused 4ms+24ms
03-08 15:56:31.498: E/CursorWindow(862): Could not allocate CursorWindow '/data/data/com.marcodeubel.kostenmanager/databases/data' of size 2097152 due to error -12.
03-08 15:56:31.544: D/AndroidRuntime(862): Shutting down VM
03-08 15:56:31.544: W/dalvikvm(862): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
03-08 15:56:31.608: E/AndroidRuntime(862): FATAL EXCEPTION: main
03-08 15:56:31.608: E/AndroidRuntime(862): android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=929 (# cursors opened by this proc=929)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.database.CursorWindow.<init>(CursorWindow.java:104)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:162)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:201)
03-08 15:56:31.608: E/AndroidRuntime(862): at com.marcodeubel.kostenmanager.BerechnerDbAdapter.fetchBerechner(BerechnerDbAdapter.java:77)
03-08 15:56:31.608: E/AndroidRuntime(862): at com.marcodeubel.fragments.GraphFragment.getIdArray(GraphFragment.java:107)
03-08 15:56:31.608: E/AndroidRuntime(862): at com.marcodeubel.fragments.GraphFragment.getPreisArray(GraphFragment.java:126)
03-08 15:56:31.608: E/AndroidRuntime(862): at com.marcodeubel.fragments.GraphFragment.onStart(GraphFragment.java:46)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.support.v4.app.Fragment.performStart(Fragment.java:1332)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:906)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.View.measure(View.java:12723)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.View.measure(View.java:12723)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.View.measure(View.java:12723)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.View.measure(View.java:12723)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
03-08 15:56:31.608: E/AndroidRuntime(862): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.View.measure(View.java:12723)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1064)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.os.Handler.dispatchMessage(Handler.java:99)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.os.Looper.loop(Looper.java:137)
03-08 15:56:31.608: E/AndroidRuntime(862): at android.app.ActivityThread.main(ActivityThread.java:4424)
03-08 15:56:31.608: E/AndroidRuntime(862): at java.lang.reflect.Method.invokeNative(Native Method)
03-08 15:56:31.608: E/AndroidRuntime(862): at java.lang.reflect.Method.invoke(Method.java:511)
03-08 15:56:31.608: E/AndroidRuntime(862): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-08 15:56:31.608: E/AndroidRuntime(862): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-08 15:56:31.608: E/AndroidRuntime(862): at dalvik.system.NativeStart.main(Native Method)
Alles anzeigen
Vielen Dank schon mal im Voraus.
LG
Marco
Hey
vielen Dank damit hat es super funktioniert
Ich habe das jetzt wie dort beschrieben gemacht...
Um den Indicator zu implementieren habe ich mich dann einfach an die Anweisungen vom Entwickler gehalten. Klappt super und sieht sau gut aus. Vielen vielen Dank noch mal!
LG
Marco
Danke schon mal für die Bemühungen
Ich denke mal, dass man bei ViewPager mit Fragmenten arbeiten muss.
Weiß jemand genaueres zu Fragmenten oder kennt jemand ein Tutorial dazu. Wäre super
Wie arbeitet man mit denen und so weiter...
LG
Marco
Also die Id stimmt habe ich eben geschaut.
Die Manifest-Datei habe ich noch mal gespeichert, da hat sich auch nichts geändert.
Kann nicht mal jemand einen Beispielcode poste, wo in dem ViewPagerAdapter in der Methode instantiateItem ein Layout mit einer ListView oder einem Button oder was auch immer hinzugefügt wird, und dann damit gearbeitet wird?
Ich habe echt keine Idee wie das gehen soll
Kann ich evt. irgendwie einfach die beiden Activitys die ich schon habe, welche eigentlich für die Layouts gewesen sind verweisen irgendwie im ViewPagerAdapter oder in der ViewPagerActivity?
Hey
wenn ich jetzt für die ViewPagerActivity folgenden Code nehme:
package com.marcodeubel.kostenmanager;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import com.viewpagerindicator.TitlePageIndicator;
public class ViewPagerActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_pager_layout);
ViewPagerAdapter Pageadapter = new ViewPagerAdapter( this );
ViewPager pager =
(ViewPager)findViewById( R.id.viewpager );
TitlePageIndicator indicator =
(TitlePageIndicator)findViewById( R.id.indicator );
pager.setAdapter( Pageadapter );
indicator.setViewPager( pager );
TextView test = (TextView) findViewById(R.id.txt_listlitermanager_gesamt);
test.setText("Test");
}
}
Alles anzeigen
Dann kommt dieser Fehler:
02-22 02:01:47.651: D/AndroidRuntime(2017): Shutting down VM
02-22 02:01:47.651: W/dalvikvm(2017): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-22 02:01:47.671: E/AndroidRuntime(2017): FATAL EXCEPTION: main
02-22 02:01:47.671: E/AndroidRuntime(2017): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.marcodeubel.kostenmanager/com.marcodeubel.kostenmanager.ViewPagerActivity}: java.lang.NullPointerException
02-22 02:01:47.671: E/AndroidRuntime(2017): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-22 02:01:47.671: E/AndroidRuntime(2017): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-22 02:01:47.671: E/AndroidRuntime(2017): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-22 02:01:47.671: E/AndroidRuntime(2017): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-22 02:01:47.671: E/AndroidRuntime(2017): at android.os.Handler.dispatchMessage(Handler.java:99)
02-22 02:01:47.671: E/AndroidRuntime(2017): at android.os.Looper.loop(Looper.java:123)
02-22 02:01:47.671: E/AndroidRuntime(2017): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-22 02:01:47.671: E/AndroidRuntime(2017): at java.lang.reflect.Method.invokeNative(Native Method)
02-22 02:01:47.671: E/AndroidRuntime(2017): at java.lang.reflect.Method.invoke(Method.java:507)
02-22 02:01:47.671: E/AndroidRuntime(2017): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-22 02:01:47.671: E/AndroidRuntime(2017): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-22 02:01:47.671: E/AndroidRuntime(2017): at dalvik.system.NativeStart.main(Native Method)
02-22 02:01:47.671: E/AndroidRuntime(2017): Caused by: java.lang.NullPointerException
02-22 02:01:47.671: E/AndroidRuntime(2017): at com.marcodeubel.kostenmanager.ViewPagerActivity.onCreate(ViewPagerActivity.java:28)
02-22 02:01:47.671: E/AndroidRuntime(2017): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-22 02:01:47.671: E/AndroidRuntime(2017): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-22 02:01:47.671: E/AndroidRuntime(2017): ... 11 more
Alles anzeigen
Ich habe ja für die zwei XML Files welche ich anzeigen will auch zwei Activitys, welche von ListActivity erben. Kann ich nicht die irgendwie verknüpfen, sodass die gleich mit den zwei Layouts geladen werden oder so?
Hi
ich habe heute versucht mit diesem Tutorial (http://blog.stylingandroid.com/archives/537) mehrere Seiten zum verschieben zu machen.
Jetzt habe ich folgendes XML-Files:
Das ist der Code vom ViewPager selbst :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.viewpagerindicator.TitlePageIndicator
android:id="@+id/indicator"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>
Alles anzeigen
Dann habe ich die Activity die dazu gehört (ViewPagerActivity):
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.widget.TextView;
import com.viewpagerindicator.TitlePageIndicator;
public class ViewPagerActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_pager_layout);
ViewPagerAdapter Pageadapter = new ViewPagerAdapter( this );
ViewPager pager =
(ViewPager)findViewById( R.id.viewpager );
TitlePageIndicator indicator =
(TitlePageIndicator)findViewById( R.id.indicator );
pager.setAdapter( Pageadapter );
indicator.setViewPager( pager );
}
}
Alles anzeigen
Und die Adapteractivity also ViewPagerAdapter:
import com.viewpagerindicator.*;
import android.content.Context;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
public class ViewPagerAdapter extends PagerAdapter
implements TitleProvider
{
private static String[] titles = new String[]
{
"Page 1",
"Page 2"
};
private final Context context;
public ViewPagerAdapter( Context context )
{
this.context = context;
}
public String getTitle( int position )
{
return titles[ position ];
}
@Override
public int getCount()
{
return titles.length;
}
@Override
public Object instantiateItem( View pager, int position )
{
LayoutInflater inflater = (LayoutInflater) pager.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
int resId = 0;
switch (position) {
case 0:
resId = R.layout.listlitermanager;
break;
case 1:
resId = R.layout.listkostenmanager;
break;
}
View view = inflater.inflate(resId, null);
((ViewPager) pager).addView(view, 0);
return view;
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView((View) arg2);
}
@Override
public boolean isViewFromObject( View view, Object object )
{
return view.equals( object );
}
@Override
public void finishUpdate( View view ) {}
@Override
public void restoreState( Parcelable p, ClassLoader c ) {}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate( View view ) {}
}
Alles anzeigen
Und jetzt habe ich moch die beiden Layoutdateien, welche auch im Adapter über public Object instantiateItem aufgerufen werden:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/txtViewListKostenmanager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="@string/txt_listkostenmanager_no_text"
android:textAppearance="?android:attr/textAppearanceLarge"
android:padding="10dip"
android:textSize="25sp"
>
</TextView>
<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/txtViewListKostenmanager"
android:layout_below="@+id/sp_listkostenmanager_auswahl" >
</ListView>
</RelativeLayout>
Alles anzeigen
Und:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/txtViewListKostenmanager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="@string/txt_listkostenmanager_no_text"
android:textAppearance="?android:attr/textAppearanceLarge"
android:padding="10dip"
android:textSize="25sp"
>
</TextView>
<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@id/txtViewListKostenmanager"
android:layout_below="@+id/sp_listkostenmanager_auswahl" >
</ListView>
</RelativeLayout>
Alles anzeigen
Das klappt auch alles super. Ich kann die ViewPagerActivity ganz normal aufrufen und bekomme dann eine Seite angezeigt, wo ich oben diese Leiste sehen kann und auf dem Bildschirm kann ich das dann alles super hin und her schieben.
Jetzt will ich aber die ListViews in den letzten beiden Layoutdateien füllen, eben so wie die TextViews. Wenn ich jetzt aber in der ViewPagerActivity ganz oben ein TextView über die Klasse R anspreche und dann mit setText einen Text setzten will, dann geht das nicht. Der gibt mir einen Laufzeitfehler aus. Wie kann ich denn jetzt auf die TextViews und ListViews in den beiden untersten Layouts zugreifen?
Ich habe schon sau viel gegoogle aber leider keine Antwort auf meine Frage gefunden
Vielen Dank schon mal!
LG
Marco
Hey
wie kann man denn von einem Preferecne Screen eine HTML Hilfeseite oder generell eine andere Seite und nicht nur eine Unterkategorie aufrufen?
Vielen Dank schon mal
LG
Marco
Ja das ist schon so eine Sache zumal ich Dbs noch nicht in der Schule hatte und bisher eher so im Halbwissen darüber bin. Und ich wusste gar nicht das es so eine ListArray gibt aber sau praktisch. Ich hoffe auch das auch andere mit deinen Tipps ihre Probleme lösen können.
Ist schon etwas länger her aber ich stehe vor dem selben Problem.
Hat da jemand eigentlich eine Antwort drauf?
LG
Marco
Hey super vielen vielen Dank hast mir echt sehr geholfen
LG
Marco
Hey vielen Dank hat mir schon super geholfen. Nur eine Frage hätte ich noch. Der beachtet den ersten Eintrag in meiner DB nicht. Also wenn ich einen Eintrag drin habe gibt der mir zurück das die Größe 0. Wenn in meiner DB zwei Einträge sind gibt der mir 1 als Größe zurück. Das verstehe ich nicht. Ich hänge einfach noch mal den Code an den ich bisher habe:
Hier den des DB-Adapters:
public Cursor fetchPreis(){
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_PREIS}, null, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
Und hier der mit dem ich dann die ArrayList erstelle und dann zum Test mal die Größe des Array ausgebe:
public ArrayList<String> getDatensaetze() {
Cursor cursor = mDbHelper.fetchPreis();
ArrayList<String> datensaetze = new ArrayList<String>();
while (cursor.moveToNext()) {
datensaetze.add(cursor.getString(0));
}
return datensaetze;
}
public void groesseanzeigen(){
TextView txt_preis = (TextView) findViewById(R.id.preis);
txt_preis.setText(String.valueOf(getDatensaetze().size()));
}
Alles anzeigen
Guten Tag
ich habe in einer App eine Datenbank erstellt und möchte mir nun alle Werte einer Spalte zurück geben lassen, aber erst mal als Variable speichern, um dann damit zu arbeiten.
Wenn ich jetzt query benutze, dann schreibe ich ja als ersten Eintrag in die Klammer den distinct wert als boolean da habe ich true. Dann schreibt man den Namen der Datenbank dann die Namen der Spalten und dann die Zeilen id oder halt null wenn man alles Zeilen haben will.
Wenn ich jetzt null reinschreibe, wie kann ich dann in meiner Activity alle Werte in eine oder mehrere Variablen speichern, wenn ich noch nicht weiß, wie viele Zeilen es gibt. Oder wie bekomme ich die höchste Zeilen id oder die Anzahl der Zeilen raus, um dann mit einer For Schleife zu arbeiten?
Ich hänge schon das ganze Wochenende an diesem Problem...
Vielen Dank schon mal im Vorraus
Marco
Ah kann der Fehler daher kommen, das wenn ich die BerchnerListActivity aus der BerechnerActivity über einen normalen Intent aufrufe, die BerchnerActivity pausiert wird. Wenn das geschieht versucht diese über onSaveInstanceState den aktuellen Status zu speichern. Dies geht aber nicht, da warum auch immer kein Status zum speichern vorliegt.
Hier noch mal die Methode:
Hey vielen Dank ich habe die Fehler verbessert und ich kann die App jetzt ohne Fehler öffnen. Nun habe ich aber eine List View mit der dazugehörigen Activity implementiert. Diese soll eigentlich die Datenbank auslesen und darstellen aber da kommt wieder ein Fehler. Ich bin wirklich am verzweifeln und hoffe es ist wieder so ein simpler Fehler wie bei "Preis/Liter".
Hier der Quellcode für die Klasse BerechnerListActivity(ist im Manifest natürlich hinzugefügt):
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.R.*;
public class BerechnerListActivity extends ListActivity {
private static final int ACTIVITY_CREATE=0;
private static final int ACTIVITY_EDIT=1;
private BerechnerDbAdapter mDbHelper;
/** Called when the activity is first created.*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.berechner_list);
mDbHelper = new BerechnerDbAdapter(this);
mDbHelper.open();
fillData();
registerForContextMenu(getListView());
}
private void fillData() {
Cursor berechnerCursor = mDbHelper.fetchAllBerechner();
startManagingCursor(berechnerCursor);
String[] from = new String[]{BerechnerDbAdapter.KEY_DATUM};
int[] to = new int[]{R.id.text1};
SimpleCursorAdapter berechner = new SimpleCursorAdapter(this, R.layout.berechner_list, berechnerCursor, from, to);
setListAdapter(berechner);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater mi = getMenuInflater();
mi.inflate(R.menu.list_menu_item_longpress, menu);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id){
super.onListItemClick(l, v, position, id);
Intent t = new Intent(this, BerechnerActivity.class);
t.putExtra(BerechnerDbAdapter.KEY_ROWID, id);
startActivityForResult(t, ACTIVITY_EDIT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent){
super.onActivityResult(requestCode, resultCode, intent);
fillData();
}
@Override
public boolean onContextItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.menu_delete:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
mDbHelper.deleteBerechner(info.id);
fillData();
return true;
}
return super.onContextItemSelected(item);
}
}
Alles anzeigen
Diese rufe ich über einen einfachen Intent auf. Dann gibt es aber einen Laufzeitfehler mit folgenden Ausgaben:
02-03 15:16:53.283: W/KeyCharacterMap(274): No keyboard for id 0
02-03 15:16:53.283: W/KeyCharacterMap(274): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
02-03 15:16:59.922: D/AndroidRuntime(274): Shutting down VM
02-03 15:16:59.922: W/dalvikvm(274): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
02-03 15:16:59.922: E/AndroidRuntime(274): Uncaught handler: thread main exiting due to uncaught exception
02-03 15:16:59.942: E/AndroidRuntime(274): java.lang.RuntimeException: Unable to pause activity {com.marcodeubel.berechner/com.marcodeubel.berechner.BerechnerActivity}: java.lang.NullPointerException
02-03 15:16:59.942: E/AndroidRuntime(274): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3162)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3119)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3102)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.app.ActivityThread.access$2400(ActivityThread.java:119)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.os.Handler.dispatchMessage(Handler.java:99)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.os.Looper.loop(Looper.java:123)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.app.ActivityThread.main(ActivityThread.java:4363)
02-03 15:16:59.942: E/AndroidRuntime(274): at java.lang.reflect.Method.invokeNative(Native Method)
02-03 15:16:59.942: E/AndroidRuntime(274): at java.lang.reflect.Method.invoke(Method.java:521)
02-03 15:16:59.942: E/AndroidRuntime(274): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-03 15:16:59.942: E/AndroidRuntime(274): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-03 15:16:59.942: E/AndroidRuntime(274): at dalvik.system.NativeStart.main(Native Method)
02-03 15:16:59.942: E/AndroidRuntime(274): Caused by: java.lang.NullPointerException
02-03 15:16:59.942: E/AndroidRuntime(274): at com.marcodeubel.berechner.BerechnerActivity.onSaveInstanceState(BerechnerActivity.java:94)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.app.Activity.performSaveInstanceState(Activity.java:1022)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1180)
02-03 15:16:59.942: E/AndroidRuntime(274): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3144)
02-03 15:16:59.942: E/AndroidRuntime(274): ... 12 more
02-03 15:16:59.982: I/dalvikvm(274): threadid=7: reacting to signal 3
02-03 15:16:59.982: E/dalvikvm(274): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
02-03 15:17:01.823: I/Process(274): Sending signal. PID: 274 SIG: 9
Alles anzeigen
Ich habe es versucht nachdem ich Daten in die Db eingetragen habe und auch ohne Daten aber es geht nicht.
Hier noch mal der Quelltext für den Adapter der Db:
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class BerechnerDbAdapter {
private static final String DATABASE_NAME = "data";
private static final String DATABASE_TABLE = "berechner";
private final int DATABASE_VERSION = 1;
public static final String KEY_ROWID = "_id";
public static final String KEY_PREISLITER = "PreisProLiter";
public static final String KEY_PREIS = "Preis";
public static final String KEY_LITER = "Liter";
public static final String KEY_KM = "KM";
public static final String KEY_DATUM = "Datum";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + " ("
+ KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ KEY_PREISLITER + " TEXT NOT NULL, "
+ KEY_LITER + " TEXT NOT NULL, "
+ KEY_PREIS + " TEXT NOT NULL, "
+ KEY_KM + " TEXT NOT NULL, "
+ KEY_DATUM + " TEXT NOT NULL);";
private final Context mCtx;
public BerechnerDbAdapter(Context ctx){
this.mCtx = ctx;
}
public BerechnerDbAdapter open() throws SQLException{
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close(){
mDbHelper.close();
}
public long createBerechner(String PreisProLiter, String Liter, String Preis, String km, String Datum){
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_PREISLITER, PreisProLiter);
initialValues.put(KEY_PREIS, Preis);
initialValues.put(KEY_LITER, Liter);
initialValues.put(KEY_KM, km);
initialValues.put(KEY_DATUM, Datum);
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
public boolean deleteBerechner(long rowId){
return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null)>0;
}
public Cursor fetchAllBerechner(){
return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_PREISLITER, KEY_PREIS, KEY_LITER, KEY_KM, KEY_DATUM}, null, null, null, null, null);
}
public Cursor fetchBerechner(long rowId) throws SQLException{
Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_PREISLITER, KEY_PREIS, KEY_LITER, KEY_KM, KEY_DATUM}, KEY_ROWID + "=" + rowId, null, null, null, null, null);
if(mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
public boolean updateBerechner(long rowId, String PreisProLiter, String Preis, String Liter, String km, String Datum){
ContentValues args = new ContentValues();
args.put(KEY_PREISLITER, PreisProLiter);
args.put(KEY_PREIS, Preis);
args.put(KEY_LITER, Liter);
args.put(KEY_KM, km);
args.put(KEY_DATUM, Datum);
return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null)>0;
}
public class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
}
}
}
Alles anzeigen
Vielen Dank für die Hilfe
Lg Marco