SQLLite

  • Antworten:10
Mac Systems
  • Forum-Beiträge: 1.727

11.09.2009, 03:42:08 via Website

Ich überlege gerade wie Ich aus meiner bisherigen Implementierung zu einer mit Datenbank Nutzung Refactoren kann. Was deutliche Vorteile später in der Implementierung einiger Views mit sich geben würde über einen Cursor (Ok, da bin ich noch nicht ...).


Unter http://zentus.com/sqlitejdbc/ findet sich eine SQL Implementierung. Ich frage mich in wie weit diese der Android Impl. konform ist ?
Mir geht es darum einige Tests zu schreiben die die DB befüllen und mir eine smarte Fassade schreiben über die Ich Daten auslesen kann.

Macht es Sinn vorher mittels dieser SQL Lite Impl. zu arbeiten oder kann Ich das sogar über das Android Eclipse Plugin tun (Weiteres Eclipse DB Plugin ?) ? Es wäre halt sehr hilfreich ein DB Tool zu haben das mir immer den Einblick in die DB verschafft, geht sowas remote in den Emulator ?

Ich hoffe Ich habe mich halbwegs verständlich ausgedrückt ....

— geändert am 11.09.2009, 03:45:41

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

11.09.2009, 09:02:30 via Website

Moin Mac,

ich weiss nicht wie es um Dein Wissen zu Datenbanken steht.

Willst Du grundsätzlich mal reinschnuppern in die vorhandenen Datenbanken des Android, kannst Du Dir eine Datenbank bspw. sehr einfach mit z.B. folgendem Befehl sehr einfach mal auf den Rechner ziehen.

adb pull /data/data/com.android.providers.telephony/databases/telephony.db telephony.db

Danach kannst Du diese Datenbank mit einem einfachen DB Manager wie zum beispiel dem SqliteManager den es als Plugin für Firefox gibt SQLite Manager
in die DB hineinschnuppern und Dir die Inhalte und Strukturen ansehen.

Ob es sinnvoll ist für die Programmierung von Android SQLite ein Framework von einem Drittanbieter zu verwenden möchte ich mal anzweitfeln. Du erzeugst damit nicht notwendigerweise größere .apks die das jeweilige Handy belasten. Es ist im Grund ja alles an Bord um mit den Datenbanken zu arbeiten.

Ich würde mir vielleicht maximal eine kleine Helperklasse als Wrapper schreiben um in meiner individuellen Art und Weise auf die DB zuzugreifen. Mehr sollte es dann aber meiner Meinung nach nicht sein.

Der SqLiteManager kann exportieren und importieren, womit Du Dir recht einfache Befüllungs und Testszenarien zurechtbauen könntest. Was natürlich auch zu Fuss über Bulk-inserts manuell funktioniert für ein Testszenario.

Durch meine langjährige Arbeit mit großen Oracle und Mysql installationen bin ich teilweise sehr puristisch geworden was den Programmatischen Umgang mit Datenbanken angeht da ich die Erfahrung gemacht habe das Entwickler die Komplexität von unterstützenden Framworks ab einem gewissen Punkt kaum mehr gehandelt bekommen, da sie nicht das notwendige Hintergrundwissen zu Datenbanken haben.
Es hat sich immer wieder herausgestellt, das weniger oft mehr ist und eine vernünftige Planung der Datenbank selber (gemeinsam mit einem DB-Admin) im Vorfeld, da wesentliche Zeiteinsparungen gebracht hätte gegenüber dem Einsatz von Frameworks wie bspw. Hibernate. (EInarbeitung, Verständniss, Wartung, Konfiguration, Verwendung).

Aber das führt dann hier glaub ich zu weit *grins* ..

Ich selber hab am Android gerade mal ein paar selects und inserts in vorhandene Datenbanken gemacht und werd mich aber sicherlich demnächst mal rein interessehalber mit einer etwas größeren Datenbank auf einem Android Device beschäftigen. Mich interessiert sehr stark, in wie weit unter welchen Umständen Apps beschleunigt werden können durch entsprechende Tuningmaßnahmen in den jeweiligen Datenbanken. Das ist so eine Art Hobbythema von mir, Datenbanktuning.

lg
Voss

lg Voss

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

14.09.2009, 16:04:24 via Website

Moin,

keine Angst Ich will keinen OR Mapper benutzen ;) Das wäre auf Android sicher fatal für die Performance.

Ich habe gerade versucht den SQLlite Manager unter meinem Firefox 3.014 zu installieren, was fehlschlug, die SQL Erweiterung will schon 3.5.x haben. Ich möchte mich aber nicht mit den Firefox 3.5 auf meiner Linux Kiste installieren.

Nun habe Ich ein wenig zu SQLLite gelesen, soweit okay. Im Android Kontext stolperte Ich dann über den SQLLiteOpenHelper der erweitert werden soll. Mir ist allerdings unklar ob dieser nicht auch von Android selbst gestartet werden kann um die Datenbank anzulegen/Update ähnlich einem Service mittels Filter ?
Oder muss das aus meinem Service/Main Activity selbst geschehen ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

14.09.2009, 16:24:11 via Website

Die schönsten Posts sind die die man selbst beantworten kann, im SDK findet sich Code der an sich klar macht wie die Kiste zu benutzen ist:
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.example.android.notepad;
18
19import com.example.android.notepad.NotePad.Notes;
20
21import android.content.ContentProvider;
22import android.content.ContentUris;
23import android.content.ContentValues;
24import android.content.Context;
25import android.content.UriMatcher;
26import android.content.res.Resources;
27import android.database.Cursor;
28import android.database.SQLException;
29import android.database.sqlite.SQLiteDatabase;
30import android.database.sqlite.SQLiteOpenHelper;
31import android.database.sqlite.SQLiteQueryBuilder;
32import android.net.Uri;
33import android.text.TextUtils;
34import android.util.Log;
35
36import java.util.HashMap;
37
38/**
39 * Provides access to a database of notes. Each note has a title, the note
40 * itself, a creation date and a modified data.
41 */
42public class NotePadProvider extends ContentProvider {
43
44 private static final String TAG = "NotePadProvider";
45
46 private static final String DATABASE_NAME = "note_pad.db";
47 private static final int DATABASE_VERSION = 2;
48 private static final String NOTES_TABLE_NAME = "notes";
49
50 private static HashMap<String, String> sNotesProjectionMap;
51
52 private static final int NOTES = 1;
53 private static final int NOTE_ID = 2;
54
55 private static final UriMatcher sUriMatcher;
56
57 /**
58 * This class helps open, create, and upgrade the database file.
59 */
60 private static class DatabaseHelper extends SQLiteOpenHelper {
61
62 DatabaseHelper(Context context) {
63 super(context, DATABASE_NAME, null, DATABASE_VERSION);
64 }
65
66 @Override
67 public void onCreate(SQLiteDatabase db) {
68 db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME + " ("
69 + Notes._ID + " INTEGER PRIMARY KEY,"
70 + Notes.TITLE + " TEXT,"
71 + Notes.NOTE + " TEXT,"
72 + Notes.CREATED_DATE + " INTEGER,"
73 + Notes.MODIFIED_DATE + " INTEGER"
74 + ");");
75 }
76
77 @Override
78 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
79 Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
80 + newVersion + ", which will destroy all old data");
81 db.execSQL("DROP TABLE IF EXISTS notes");
82 onCreate(db);
83 }
84 }
85
86 private DatabaseHelper mOpenHelper;
87
88 @Override
89 public boolean onCreate() {
90 mOpenHelper = new DatabaseHelper(getContext());
91 return true;
92 }
93
94 @Override
95 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
96 String sortOrder) {
97 SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
98
99 switch (sUriMatcher.match(uri)) {
100 case NOTES:
101 qb.setTables(NOTES_TABLE_NAME);
102 qb.setProjectionMap(sNotesProjectionMap);
103 break;
104
105 case NOTE_ID:
106 qb.setTables(NOTES_TABLE_NAME);
107 qb.setProjectionMap(sNotesProjectionMap);
108 qb.appendWhere(Notes._ID + "=" + uri.getPathSegments().get(1));
109 break;
110
111 default:
112 throw new IllegalArgumentException("Unknown URI " + uri);
113 }
114
115 // If no sort order is specified use the default
116 String orderBy;
117 if (TextUtils.isEmpty(sortOrder)) {
118 orderBy = NotePad.Notes.DEFAULT_SORT_ORDER;
119 } else {
120 orderBy = sortOrder;
121 }
122
123 // Get the database and run the query
124 SQLiteDatabase db = mOpenHelper.getReadableDatabase();
125 Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
126
127 // Tell the cursor what uri to watch, so it knows when its source data changes
128 c.setNotificationUri(getContext().getContentResolver(), uri);
129 return c;
130 }
131
132 @Override
133 public String getType(Uri uri) {
134 switch (sUriMatcher.match(uri)) {
135 case NOTES:
136 return Notes.CONTENT_TYPE;
137
138 case NOTE_ID:
139 return Notes.CONTENT_ITEM_TYPE;
140
141 default:
142 throw new IllegalArgumentException("Unknown URI " + uri);
143 }
144 }
145
146 @Override
147 public Uri insert(Uri uri, ContentValues initialValues) {
148 // Validate the requested uri
149 if (sUriMatcher.match(uri) != NOTES) {
150 throw new IllegalArgumentException("Unknown URI " + uri);
151 }
152
153 ContentValues values;
154 if (initialValues != null) {
155 values = new ContentValues(initialValues);
156 } else {
157 values = new ContentValues();
158 }
159
160 Long now = Long.valueOf(System.currentTimeMillis());
161
162 // Make sure that the fields are all set
163 if (values.containsKey(NotePad.Notes.CREATED_DATE) == false) {
164 values.put(NotePad.Notes.CREATED_DATE, now);
165 }
166
167 if (values.containsKey(NotePad.Notes.MODIFIED_DATE) == false) {
168 values.put(NotePad.Notes.MODIFIED_DATE, now);
169 }
170
171 if (values.containsKey(NotePad.Notes.TITLE) == false) {
172 Resources r = Resources.getSystem();
173 values.put(NotePad.Notes.TITLE, r.getString(android.R.string.untitled));
174 }
175
176 if (values.containsKey(NotePad.Notes.NOTE) == false) {
177 values.put(NotePad.Notes.NOTE, "");
178 }
179
180 SQLiteDatabase db = mOpenHelper.getWritableDatabase();
181 long rowId = db.insert(NOTES_TABLE_NAME, Notes.NOTE, values);
182 if (rowId > 0) {
183 Uri noteUri = ContentUris.withAppendedId(NotePad.Notes.CONTENT_URI, rowId);
184 getContext().getContentResolver().notifyChange(noteUri, null);
185 return noteUri;
186 }
187
188 throw new SQLException("Failed to insert row into " + uri);
189 }
190
191 @Override
192 public int delete(Uri uri, String where, String[] whereArgs) {
193 SQLiteDatabase db = mOpenHelper.getWritableDatabase();
194 int count;
195 switch (sUriMatcher.match(uri)) {
196 case NOTES:
197 count = db.delete(NOTES_TABLE_NAME, where, whereArgs);
198 break;
199
200 case NOTE_ID:
201 String noteId = uri.getPathSegments().get(1);
202 count = db.delete(NOTES_TABLE_NAME, Notes._ID + "=" + noteId
203 + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
204 break;
205
206 default:
207 throw new IllegalArgumentException("Unknown URI " + uri);
208 }
209
210 getContext().getContentResolver().notifyChange(uri, null);
211 return count;
212 }
213
214 @Override
215 public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
216 SQLiteDatabase db = mOpenHelper.getWritableDatabase();
217 int count;
218 switch (sUriMatcher.match(uri)) {
219 case NOTES:
220 count = db.update(NOTES_TABLE_NAME, values, where, whereArgs);
221 break;
222
223 case NOTE_ID:
224 String noteId = uri.getPathSegments().get(1);
225 count = db.update(NOTES_TABLE_NAME, values, Notes._ID + "=" + noteId
226 + (!TextUtils.isEmpty(where) ? " AND (" + where + ')' : ""), whereArgs);
227 break;
228
229 default:
230 throw new IllegalArgumentException("Unknown URI " + uri);
231 }
232
233 getContext().getContentResolver().notifyChange(uri, null);
234 return count;
235 }
236
237 static {
238 sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
239 sUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES);
240 sUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);
241
242 sNotesProjectionMap = new HashMap<String, String>();
243 sNotesProjectionMap.put(Notes._ID, Notes._ID);
244 sNotesProjectionMap.put(Notes.TITLE, Notes.TITLE);
245 sNotesProjectionMap.put(Notes.NOTE, Notes.NOTE);
246 sNotesProjectionMap.put(Notes.CREATED_DATE, Notes.CREATED_DATE);
247 sNotesProjectionMap.put(Notes.MODIFIED_DATE, Notes.MODIFIED_DATE);
248 }
249}

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

14.09.2009, 16:26:11 via Website

Das kann wohl nur dann von Android gestartet werden, wenn Du es in Deiner App so angibst.

Soweit ich das verstanden habe, kannst Du mit diesem "Wrapper" die Logik ob eine DB erst angelegt, bzw. upgedatet werden muss komplett verstecken. Der Wrapper nimmt Dir die Arbeit dafür ab bei entsprechender Implementierung.

Viel mehr weiß ich leider auch nicht über das Ding.

lg
Voss

lg Voss

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

16.09.2009, 14:44:49 via Website

Habe damit jetzt zwei Tage gespielt, soweit ist das recht intuitiv. Meine Recherche fad leider keine guten alternativen zum dem Firefox Plugin. Kennt jemand noch andere SQLite Tools die genutzt werden können ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

16.09.2009, 16:01:38 via Website

Ach Mac,

Tools gibts da wohl mehr als genug. Schau mal hier .. ein ganzer Haufen .. da solltest was finden!

http://www.sqlite.org/cvstrac/wiki?p=ManagementTools


lg
Voss

lg Voss

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

16.09.2009, 16:59:03 via Website

Ok, hab da mal wieder bisschen auf dem Schlauch gestanden :*)

Versuche jetzt erstmal aus Eclipse heraus eine Verbindung auf den Emulator zu bekommen. Treiber habe Ich soweit, leider findet sich nicht die Info wie Ich auf den Emulator per JDBC komme. Hat jemand einen Tipp ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

16.09.2009, 18:40:32 via Website

Hi mac,

soweit ich das sehe, kannst Du das gar nicht. Auf dem Emulator oder dem Device rennt ja kein Server
auf den man connecten könnte.

Es gibt zwar die JDBC Klassen, aber die sind scheinbar nicht für SQLITE vorgesehen.

Du kannst maximal über die Angabe eines Verzeichnispfades auf die DB zugreifen. Also bspw.

/data/data/com.voss.example/my-test.db

Und an den wirst Du wohl via Eclipse nicht herankommen.

lg
Voss

lg Voss

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

25.10.2009, 01:19:14 via Website

Kennt jemand noch andere SQLite Tools die genutzt werden können ?
Ich benutze Sqliteman, weil der im Ggs zum FF-Plugin auch mit umfangreichen resultsets zügig reagiert.

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

25.10.2009, 02:58:41 via Website

Danke,

werde mir das mal anschauen.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten