ja das hab ich nachträglich geändert, weil die Spalte NOT NULL sein soll.
Also hier nochmal der Aktuellste Stand:
Der wichtigste Teil, also der DB-Teil befindet sich im unteren bereich der Main-Activity
MAIN:
1package de.mcadd.mcaddtutorialviewer;
2
3import java.io.BufferedReader;
4import java.io.InputStream;
5import java.io.InputStreamReader;
6
7import org.apache.http.HttpEntity;
8import org.apache.http.HttpResponse;
9import org.apache.http.client.HttpClient;
10import org.apache.http.client.methods.HttpGet;
11import org.apache.http.impl.client.DefaultHttpClient;
12import org.json.JSONArray;
13import org.json.JSONException;
14import org.json.JSONObject;
15
16import android.net.Uri;
17import android.os.Bundle;
18import android.app.Activity;
19import android.app.AlertDialog;
20import android.app.Notification;
21import android.app.NotificationManager;
22import android.app.PendingIntent;
23import android.content.Intent;
24import android.database.sqlite.SQLiteDatabase;
25import android.util.Log;
26import android.view.Menu;
27import android.view.MenuItem;
28import android.view.View;
29import android.widget.EditText;
30import android.widget.TextView;
31import android.widget.Toast;
32
33public class Activity_Main extends Activity
34{
35 // Datenbank
36 private DB_Manager mHelper;
37 private SQLiteDatabase mDatenbank;
38
39 // ID für die Benachrichtigung
40 public static final int NOTIFICATION_ID = 1;
41
42
43
44 @Override
45 protected void onCreate(Bundle savedInstanceState)
46 {
47 super.onCreate(savedInstanceState);
48 setContentView(R.layout.main);
49
50 // DB öffnen
51 mHelper = new DB_Manager(this);
52 mDatenbank = mHelper.getReadableDatabase();
53 Toast.makeText(this, "Datenbank geöffnet", Toast.LENGTH_SHORT).show();
54
55 //Funktion zum Datenbankupdate aufrufen in neuem Thread
56 Runnable r = new Runnable() {
57 @Override
58 public void run() {
59 //getData() aufrufen
60 getData();
61 Log.d("Info", "Runnable");
62 }
63 };
64 Thread t = new Thread(r);
65 t.start();
66 Log.d("Info", "Thread");
67 }
68
69 @Override
70 protected void onStart()
71 {
72 super.onStart();
73
74 //Benachrichtigung
75 NotificationManager nm =
76 (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
77 Notification notification =
78 new Notification(R.drawable.ic_launcher,
79 getResources().getString(R.string.notification_title),
80 System.currentTimeMillis());
81 Intent intent = new Intent(this, Activity_Info.class);
82 PendingIntent pendingIntent =
83 PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);
84 notification.setLatestEventInfo(getApplicationContext(),
85 getResources().getString(R.string.notification_title),
86 getResources().getString(R.string.notification_text),
87 pendingIntent);
88
89 nm.notify(Activity_Main.NOTIFICATION_ID, notification);
90 }
91
92 @Override
93 protected void onDestroy()
94 {
95 super.onDestroy();
96
97 //Benachrichtigung wieder löschen
98 NotificationManager nm =
99 (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
100 nm.cancel(NOTIFICATION_ID);
101
102 //DB schliessen
103 mDatenbank.close();
104 Toast.makeText(this, "Datenbank geschlossen", Toast.LENGTH_SHORT).show();
105 }
106
107
108 // clicken von Buttons
109 public void onButtonClick(View v)
110 {
111 switch(v.getId())
112 {
113 case R.id.button_search:
114 EditText searchField = (EditText) findViewById(R.id.editText_search);
115 String search = searchField.getText().toString();
116 if (search.length() == 0)
117 {
118 new AlertDialog.Builder(this)
119 .setTitle(R.string.error_title)
120 .setIcon(android.R.drawable.ic_dialog_info)
121 .setMessage(R.string.error_search_missing)
122 .setNeutralButton(R.string.error_ok, null)
123 .show();
124 return;
125 }
126 break;
127 case R.id.button_all_videos:
128 Intent intent = new Intent(Activity_Main.this, Activity_List_Category.class);
129 this.startActivity(intent);
130 break;
131 case R.id.button_exit:
132 finish();
133 break;
134 }
135 }
136
137
138
139 //OptionsMenü
140 @Override
141 public boolean onCreateOptionsMenu(Menu menu)
142 {
143 // Inflate the menu; this adds items to the action bar if it is present.
144 getMenuInflater().inflate(R.menu.main, menu);
145 return true;
146 }
147
148 @Override
149 public boolean onOptionsItemSelected(MenuItem item)
150 {
151 switch (item.getItemId())
152 {
153 case R.id.menu_info:
154 Intent info = new Intent(this, Activity_Info.class);
155 startActivity(info);
156 return true;
157 case R.id.menu_shop:
158 //Ist ein geeigneter Webbrowser verfügbar?
159 try
160 {
161 //explizieter Intent (Intent ins Blaue)
162 Intent browser = new Intent(Intent.ACTION_VIEW, Uri.parse("LINK"));
163 startActivity(browser);
164 }
165 //Wenn kein geeigneter Webbrowser verfügbar ist.
166 catch (Exception e)
167 {
168 Log.e("Fehler", "Fehler ist aufgetreten "+e.toString());
169
170 new AlertDialog.Builder(this)
171 .setTitle(R.string.error_title)
172 .setIcon(android.R.drawable.ic_dialog_info)
173 .setMessage(R.string.error_browser_missing)
174 .setNeutralButton(R.string.error_ok, null)
175 .show();
176 }
177 return true;
178 case R.id.menu_settings:
179 Intent settings = new Intent(this, Activity_Settings.class);
180 startActivity(settings);
181 return true;
182 case R.id.menu_impressum:
183 Intent impressum = new Intent(this, Activity_Impressum.class);
184 startActivity(impressum);
185 return true;
186 default:
187 return super.onOptionsItemSelected(item);
188 }
189 }
190
191 // MySQL to SQLite
192 InputStream is;
193
194 public void getData()
195 {
196 String result = "";
197
198 //HTTP get
199 try
200 {
201 String link ="LINK";
202
203 HttpClient httpclient = new DefaultHttpClient();
204 HttpGet httpget = new HttpGet(link);
205 HttpResponse response = httpclient.execute(httpget);
206 HttpEntity entity = response.getEntity();
207 is = entity.getContent();
208 }
209 catch(Exception e)
210 {
211 //Gibt Fehlermeldung aus, wenn PHP-Datei nicht aufgerufen werden kann
212 Log.e("Fehler", "Fehler ist aufgetreten = "+e.toString());
213 }
214
215 //covert response to string
216 try
217 {
218 BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
219 StringBuilder sb = new StringBuilder();
220 String line = null;
221 while ((line = reader.readLine()) != null)
222 {
223 Log.v("Test",line);
224 sb.append(line + "\n");
225 }
226 is.close();
227 result=sb.toString();
228 TextView textView = (TextView) findViewById(R.id.textViewtest);
229 textView.setText(result);
230 }
231 catch(Exception e)
232 {
233 //Gibt Fehlermeldung aus, wenn MySQL-Datenbank nicht gelesen werden kann
234 Log.e("Fehler", "Fehler ist aufgetreten = "+e.toString());
235 }
236
237 //parse json data
238 try{
239 JSONArray jArray = new JSONArray(result);
240 for(int i=0;i<jArray.length();i++)
241 {
242 JSONObject json_data = jArray.getJSONObject(i);
243 mHelper.insertData
244 (json_data.getString("ID"),
245 json_data.getString("CATEGORY"),
246 json_data.getString("NAME"),
247 json_data.getString("DESCRIPTION"),
248 json_data.getString("LINK"));
249 }
250 }
251 catch(JSONException e)
252 {
253 //Gibt Fehlermeldung aus, wenn MySQLtoSQLite fehlschlägt
254 Log.e("Fehler", "Fehler ist aufgetreten = "+e.toString());
255 }
256 }
257}
DB_MANAGER:
1package de.mcadd.mcaddtutorialviewer;
2
3import android.content.ContentValues;
4import android.content.Context;
5import android.database.sqlite.SQLiteDatabase;
6import android.database.sqlite.SQLiteOpenHelper;
7import android.database.sqlite.SQLiteStatement;
8import android.util.Log;
9
10public class DB_Manager extends SQLiteOpenHelper {
11
12 private SQLiteDatabase db;
13
14 private static final String DB_NAME = "App_Datenbank.db";
15 private static final String DB_TABLE_NAME = "Tutorial";
16 private static final int DB_VERSION = 1;
17
18 public static final String KEY_ID = "_ID";
19 public static final String KEY_CATEGORY = "CATEGORY";
20 public static final String KEY_NAME = "NAME";
21 public static final String KEY_DESCRIPTION = "DESCRIPTION";
22 public static final String KEY_LINK = "LINK";
23
24 private static final String DB_INSERT = "insert into Tutorial(_ID,CATEGORY,NAME,DESCRIPTION,LINK) values(1,Tom,Fiete,Schöner Link, www.fc-hansa.de)";
25
26 private static final String DB_CREATE =
27 "CREATE TABLE Tutorial (" +
28 "_ID INTEGER PRIMARY KEY AUTOINCREMENT," +
29 "CATEGORY TEXT NOT NULL, " +
30 "NAME TEXT NOT NULL, " +
31 "DESCRIPTION TEXT NOT NULL," +
32 "LINK TEXT NOT NULL" +
33 ")";
34
35 private static final String DB_DROPE = "DROP TABLR IF EXIST Tutorial";
36
37 // Konstruktor
38 public DB_Manager(Context context)
39 {
40 super(context, DB_NAME, null, DB_VERSION);
41 }
42
43 public void onCreate(SQLiteDatabase db)
44 {
45 try
46 {
47 // Tabelle anlegen
48 db.execSQL(DB_CREATE);
49 //db.execSQL(DB_INSERT);
50 }
51 catch(Exception e) {
52 Log.e("Fehler", e.getMessage());
53 }
54
55 }
56
57 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
58 {
59 // auf Versionswechsel reagieren
60 db.execSQL(DB_DROPE);
61 onCreate(db);
62 }
63
64 public long insertData(String id, String category, String name, String description, String link)
65 {
66 ContentValues initialValues = new ContentValues();
67 initialValues.put(KEY_ID, id);
68 initialValues.put(KEY_CATEGORY, category);
69 initialValues.put(KEY_NAME, name);
70 initialValues.put(KEY_DESCRIPTION, description);
71 initialValues.put(KEY_LINK, link);
72 return db.insert(DB_TABLE_NAME, null, initialValues);
73 }
74
75 }
So jetzt wollte ich mal über den Emulator Starten und nun gibt er einen Fehler aus, der jedoch nichts mit der DB zu tun hat, sondern mit dem Thread, auf Handy geht aber alles.
LOG:
101-21 19:00:22.974: D/AndroidRuntime(1855): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
201-21 19:00:22.974: D/AndroidRuntime(1855): CheckJNI is ON
301-21 19:00:23.555: D/AndroidRuntime(1855): Calling main entry com.android.commands.pm.Pm
401-21 19:00:23.575: D/AndroidRuntime(1855): Shutting down VM
501-21 19:00:23.585: D/dalvikvm(1855): GC_CONCURRENT freed 101K, 71% free 297K/1024K, external 0K/0K, paused 1ms+1ms
601-21 19:00:23.585: D/dalvikvm(1855): Debugger has detached; object registry had 1 entries
701-21 19:00:23.595: I/AndroidRuntime(1855): NOTE: attach of thread 'Binder Thread #3' failed
801-21 19:00:23.915: D/AndroidRuntime(1871): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
901-21 19:00:23.915: D/AndroidRuntime(1871): CheckJNI is ON
1001-21 19:00:24.424: D/AndroidRuntime(1871): Calling main entry com.android.commands.am.Am
1101-21 19:00:24.444: I/ActivityManager(74): Force stopping package de.mcadd.mcaddtutorialviewer uid=10034
1201-21 19:00:24.444: I/Process(74): Sending signal. PID: 1813 SIG: 9
1301-21 19:00:24.464: I/WindowManager(74): WIN DEATH: Window{40800f78 de.mcadd.mcaddtutorialviewer/de.mcadd.mcaddtutorialviewer.Activity_Main paused=false}
1401-21 19:00:24.514: I/ActivityManager(74): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=de.mcadd.mcaddtutorialviewer/.Activity_Main } from pid 1871
1501-21 19:00:24.554: D/AndroidRuntime(1871): Shutting down VM
1601-21 19:00:24.574: D/dalvikvm(1871): GC_CONCURRENT freed 102K, 69% free 322K/1024K, external 0K/0K, paused 1ms+1ms
1701-21 19:00:24.574: D/jdwp(1871): Got wake-up signal, bailing out of select
1801-21 19:00:24.574: D/dalvikvm(1871): Debugger has detached; object registry had 1 entries
1901-21 19:00:24.615: I/ActivityManager(74): Start proc de.mcadd.mcaddtutorialviewer for activity de.mcadd.mcaddtutorialviewer/.Activity_Main: pid=1880 uid=10034 gids={3003}
2001-21 19:00:24.625: I/dalvikvm(1871): JNI: AttachCurrentThread (from ???.???)
2101-21 19:00:24.625: I/AndroidRuntime(1871): NOTE: attach of thread 'Binder Thread #3' failed
2201-21 19:00:24.634: W/InputManagerService(74): Got RemoteException sending setActive(false) notification to pid 1813 uid 10034
2301-21 19:00:25.025: W/ActivityThread(1880): Application de.mcadd.mcaddtutorialviewer is waiting for the debugger on port 8100...
2401-21 19:00:25.036: I/System.out(1880): Sending WAIT chunk
2501-21 19:00:25.036: I/dalvikvm(1880): Debugger is active
2601-21 19:00:25.235: I/System.out(1880): Debugger has connected
2701-21 19:00:25.235: I/System.out(1880): waiting for debugger to settle...
2801-21 19:00:25.435: I/System.out(1880): waiting for debugger to settle...
2901-21 19:00:25.635: I/System.out(1880): waiting for debugger to settle...
3001-21 19:00:25.904: I/System.out(1880): waiting for debugger to settle...
3101-21 19:00:26.104: I/System.out(1880): waiting for debugger to settle...
3201-21 19:00:26.305: I/System.out(1880): waiting for debugger to settle...
3301-21 19:00:26.522: I/System.out(1880): waiting for debugger to settle...
3401-21 19:00:26.724: I/System.out(1880): waiting for debugger to settle...
3501-21 19:00:26.940: I/System.out(1880): waiting for debugger to settle...
3601-21 19:00:27.144: I/System.out(1880): waiting for debugger to settle...
3701-21 19:00:27.346: I/System.out(1880): debugger has settled (1302)
3801-21 19:00:27.755: D/dalvikvm(1880): GC_EXTERNAL_ALLOC freed 44K, 53% free 2547K/5379K, external 1625K/2137K, paused 44ms
3901-21 19:00:28.235: D/Info(1880): Thread
4001-21 19:00:29.185: I/ActivityManager(74): Displayed de.mcadd.mcaddtutorialviewer/.Activity_Main: +4s575ms
4101-21 19:00:29.986: V/Test(1880): [{"ID":"1","CATEGORY":"Joomla","NAME":"Joomla 1.0","DESCRIPTION":null,"LINK":"rtsp:\/\/v8.cache3.c.youtube.com\/CjYLENy73wIaLQlZXP-ZmMLz7hMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYPW6vc3T7bT1UAw=\/0\/0\/0\/video.3gp"},{"ID":"2","CATEGORY":"Joomla","NAME":"Joomla 1.5","DESCRIPTION":null,"LINK":"rtsp:\/\/v8.cache3.c.youtube.com\/CjYLENy73wIaLQlZXP-ZmMLz7hMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYPW6vc3T7bT1UAw=\/0\/0\/0\/video.3gp"},{"ID":"3","CATEGORY":"Test","NAME":"Test 1.5","DESCRIPTION":null,"LINK":"rtsp:\/\/v8.cache3.c.youtube.com\/CjYLENy73wIaLQlZXP-ZmMLz7hMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYPW6vc3T7bT1UAw=\/0\/0\/0\/video.3gp"}]
4201-21 19:00:30.055: E/Fehler(1880): Fehler ist aufgetreten = android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
— geändert am 23.01.2013, 13:00:57
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.