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