问题
I've been doing research in the internet for 15-20 hours and can't find the answer to this question yet "How to read and update SQLite database using ListView in Android?" in other words how do you make the ListView Items Intent to the saved data in the SQLite Database and how to update them once you get to the other activity. I have tried many different ways to do this and so far they either don't work or crash my application. Can someone please help or at least lead me to the right direction, thank you.
activity_main_activity_planes.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivityPlanes" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/button1"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:orientation="vertical" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
<Button
android:id="@+id/button1"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="@string/add_button" />
</RelativeLayout>
activity_main_activity_paper.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivityPaper" >
<EditText
android:id="@+id/editText1"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/editText3"
android:ems="10" >
</EditText>
<Button
android:id="@+id/button3"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/editText3"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/save_button" />
<Button
android:id="@+id/button5"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/editText3"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="@string/update_button" />
<EditText
android:id="@+id/editText3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:ems="10"
android:inputType="text" >
</EditText>
</RelativeLayout>
MainActivityPlanes.java
public class MainActivityPlanes extends Activity {
Button Add;
ListView List;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main_activity_planes);
Add = (Button) findViewById(R.id.button1);
List = (ListView) findViewById(R.id.listView1);
List.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> listView, View itemView, int itemPosition, long itemId)
{
Intent launchActivity = new Intent(MainActivityPlanes.this, MainActivityChampagne.class);
startActivity(launchActivity);
}
});
Add.setOnClickListener(new OnClickListener () {
public void onClick (View v) {
Intent intent = new Intent (v.getContext(), MainActivityPaper.class);
startActivityForResult(intent, 0);
}
});
MainActivityChampagne info = new MainActivityChampagne(this);
info.open();
ArrayList<String> data = info.getData();
info.close();
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, data);
List.setAdapter(arrayAdapter);
}
}
MainActivityPaper.java
public class MainActivityPaper extends Activity implements OnClickListener {
TextView text1, title1;
Button save1, update1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main_activity_paper);
text1 = (TextView) findViewById(R.id.editText1);
title1 = (TextView) findViewById(R.id.editText3);
save1 = (Button) findViewById(R.id.button3);
update1 = (Button) findViewById(R.id.button5);
save1.setOnClickListener(this);
update1.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.button3:
String titles = title1.getText().toString();
String notes = text1.getText().toString();
MainActivityChampagne entry = new MainActivityChampagne(MainActivityPaper.this);
entry.open();
entry.createEntry(titles, notes);
entry.close();
break;
case R.id.button5:
String thetitles = title1.getText().toString();
String thenotes = text1.getText().toString();
MainActivityChampagne up = new MainActivityChampagne(MainActivityPaper.this);
up.open();
up.updateEntry(thetitles, thenotes);
up.close();
break;
}
}
}
MainActivityChampagne.java
public class MainActivityChampagne {
public static final String KEY_NAME = "title";
public static final String KEY_NOTES = "lastcall";
private static final String DATABASE_NAME = "Champagnedb";
private static final String DATABASE_TABLE = "champagneTable";
private static final int DATABASE_VERSION = 1;
private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
private static class DbHelper extends SQLiteOpenHelper{
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub\
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
KEY_NAME + " TEXT NOT NULL);"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
onCreate(db);
}
}
public MainActivityChampagne(Context c){
ourContext = c;
}
public MainActivityChampagne open(){
ourHelper = new DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close(){
ourHelper.close();
}
public long createEntry(String titles, String notes) {
// TODO Auto-generated method stub
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, titles);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}
public ArrayList<String> getData() {
//TODO Auto-generated method stub
String[] columns = new String[] { KEY_NAME };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result = "";
int iNotes = c.getColumnIndex(KEY_NAME);
ArrayList<String> string_array = new ArrayList<String>();
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
{
result = c.getString (iNotes) + "\n";
string_array.add(result);
}
return string_array;
}
public void updateEntry(String thetitles, String thenotes) {
// TODO Auto-generated method stub
ContentValues cvUpdate = new ContentValues();
cvUpdate.put(KEY_NAME, thetitles);
cvUpdate.put(KEY_NOTES, thenotes);
ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_NAME + "=" + thetitles + KEY_NOTES + "=" + thenotes, null);
}
}
LogCat
06-21 03:42:16.782: E/Trace(3639): error opening trace file: No such file or directory (2)
06-21 03:42:18.622: D/dalvikvm(3639): GC_FOR_ALLOC freed 46K, 7% free 2545K/2712K, paused 440ms, total 444ms
06-21 03:42:18.715: I/dalvikvm-heap(3639): Grow heap (frag case) to 3.673MB for 1127536-byte allocation
06-21 03:42:19.022: D/dalvikvm(3639): GC_FOR_ALLOC freed 1K, 5% free 3645K/3816K, paused 308ms, total 308ms
06-21 03:42:19.312: D/dalvikvm(3639): GC_CONCURRENT freed <1K, 5% free 3651K/3816K, paused 18ms+15ms, total 290ms
06-21 03:42:20.582: I/Choreographer(3639): Skipped 65 frames! The application may be doing too much work on its main thread.
06-21 03:42:20.752: D/gralloc_goldfish(3639): Emulator without GPU emulation detected.
06-21 03:42:21.352: I/Choreographer(3639): Skipped 33 frames! The application may be doing too much work on its main thread.
06-21 03:42:24.841: D/dalvikvm(3639): GC_FOR_ALLOC freed 25K, 4% free 3984K/4132K, paused 67ms, total 95ms
06-21 03:42:24.941: D/dalvikvm(3639): GC_FOR_ALLOC freed 10K, 4% free 4238K/4400K, paused 61ms, total 67ms
06-21 03:42:25.081: D/dalvikvm(3639): GC_CONCURRENT freed <1K, 4% free 4766K/4936K, paused 74ms+6ms, total 124ms
06-21 03:42:25.094: D/dalvikvm(3639): WAIT_FOR_CONCURRENT_GC blocked 37ms
06-21 03:42:25.193: D/dalvikvm(3639): GC_FOR_ALLOC freed 0K, 4% free 5294K/5472K, paused 57ms, total 57ms
06-21 03:42:25.293: D/dalvikvm(3639): GC_FOR_ALLOC freed <1K, 4% free 6086K/6276K, paused 57ms, total 57ms
06-21 03:42:25.453: I/Choreographer(3639): Skipped 77 frames! The application may be doing too much work on its main thread.
06-21 03:42:32.381: D/AndroidRuntime(3639): Shutting down VM
06-21 03:42:32.401: W/dalvikvm(3639): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
06-21 03:42:32.461: E/AndroidRuntime(3639): FATAL EXCEPTION: main
06-21 03:42:32.461: E/AndroidRuntime(3639): android.content.ActivityNotFoundException: Unable to find explicit activity class {android.application.project.planes/android.application.project.planes.MainActivityChampagne}; have you declared this activity in your AndroidManifest.xml?
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1618)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.app.Activity.startActivityForResult(Activity.java:3370)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.app.Activity.startActivityForResult(Activity.java:3331)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.app.Activity.startActivity(Activity.java:3566)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.app.Activity.startActivity(Activity.java:3534)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.application.project.planes.MainActivityPlanes$1.onItemClick(MainActivityPlanes.java:36)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.widget.AbsListView$1.run(AbsListView.java:3423)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.os.Handler.handleCallback(Handler.java:725)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.os.Handler.dispatchMessage(Handler.java:92)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.os.Looper.loop(Looper.java:137)
06-21 03:42:32.461: E/AndroidRuntime(3639): at android.app.ActivityThread.main(ActivityThread.java:5041)
06-21 03:42:32.461: E/AndroidRuntime(3639): at java.lang.reflect.Method.invokeNative(Native Method)
06-21 03:42:32.461: E/AndroidRuntime(3639): at java.lang.reflect.Method.invoke(Method.java:511)
06-21 03:42:32.461: E/AndroidRuntime(3639): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-21 03:42:32.461: E/AndroidRuntime(3639): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-21 03:42:32.461: E/AndroidRuntime(3639): at dalvik.system.NativeStart.main(Native Method)
06-21 03:42:35.471: I/Process(3639): Sending signal. PID: 3639 SIG: 9
06-21 03:43:13.141: D/dalvikvm(3658): GC_FOR_ALLOC freed 49K, 7% free 2545K/2716K, paused 229ms, total 232ms
06-21 03:43:13.161: I/dalvikvm-heap(3658): Grow heap (frag case) to 3.673MB for 1127536-byte allocation
06-21 03:43:13.241: D/dalvikvm(3658): GC_FOR_ALLOC freed 1K, 5% free 3645K/3820K, paused 74ms, total 74ms
06-21 03:43:13.391: D/dalvikvm(3658): GC_CONCURRENT freed <1K, 5% free 3645K/3820K, paused 10ms+4ms, total 152ms
06-21 03:43:14.711: I/Choreographer(3658): Skipped 78 frames! The application may be doing too much work on its main thread.
06-21 03:43:14.852: D/gralloc_goldfish(3658): Emulator without GPU emulation detected.
06-21 03:43:19.123: D/AndroidRuntime(3658): Shutting down VM
06-21 03:43:19.131: W/dalvikvm(3658): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
06-21 03:43:19.181: E/AndroidRuntime(3658): FATAL EXCEPTION: main
06-21 03:43:19.181: E/AndroidRuntime(3658): android.content.ActivityNotFoundException: Unable to find explicit activity class {android.application.project.planes/android.application.project.planes.MainActivityChampagne}; have you declared this activity in your AndroidManifest.xml?
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1618)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.app.Activity.startActivityForResult(Activity.java:3370)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.app.Activity.startActivityForResult(Activity.java:3331)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.app.Activity.startActivity(Activity.java:3566)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.app.Activity.startActivity(Activity.java:3534)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.application.project.planes.MainActivityPlanes$1.onItemClick(MainActivityPlanes.java:36)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.widget.AbsListView$1.run(AbsListView.java:3423)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.os.Handler.handleCallback(Handler.java:725)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.os.Handler.dispatchMessage(Handler.java:92)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.os.Looper.loop(Looper.java:137)
06-21 03:43:19.181: E/AndroidRuntime(3658): at android.app.ActivityThread.main(ActivityThread.java:5041)
06-21 03:43:19.181: E/AndroidRuntime(3658): at java.lang.reflect.Method.invokeNative(Native Method)
06-21 03:43:19.181: E/AndroidRuntime(3658): at java.lang.reflect.Method.invoke(Method.java:511)
06-21 03:43:19.181: E/AndroidRuntime(3658): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-21 03:43:19.181: E/AndroidRuntime(3658): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-21 03:43:19.181: E/AndroidRuntime(3658): at dalvik.system.NativeStart.main(Native Method)
06-21 03:43:24.262: I/Process(3658): Sending signal. PID: 3658 SIG: 9
ProjectPlanes Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.application.project.planes"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="android.application.project.planes.MainActivityPlanes"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="android.application.project.planes.MainActivityPaper"
android:label="@string/app_name" >
</activity>
</application>
</manifest>
Updated LogCat
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.View.measure(View.java:15518)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.View.measure(View.java:15518)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.View.measure(View.java:15518)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-21 05:12:14.752: E/AndroidRuntime(4313): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.View.measure(View.java:15518)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.Choreographer.doFrame(Choreographer.java:532)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.os.Handler.handleCallback(Handler.java:725)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.os.Handler.dispatchMessage(Handler.java:92)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.os.Looper.loop(Looper.java:137)
06-21 05:12:14.752: E/AndroidRuntime(4313): at android.app.ActivityThread.main(ActivityThread.java:5041)
06-21 05:12:14.752: E/AndroidRuntime(4313): at java.lang.reflect.Method.invokeNative(Native Method)
06-21 05:12:14.752: E/AndroidRuntime(4313): at java.lang.reflect.Method.invoke(Method.java:511)
06-21 05:12:14.752: E/AndroidRuntime(4313): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-21 05:12:14.752: E/AndroidRuntime(4313): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-21 05:12:14.752: E/AndroidRuntime(4313): at dalvik.system.NativeStart.main(Native Method)
06-21 05:12:19.072: I/Process(4313): Sending signal. PID: 4313 SIG: 9
回答1:
Here Is Your Edited Working Code
MainActivityChampagne.java
package android.application.project.planes;
import java.util.ArrayList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MainActivityChampagne {
public static final String KEY_NAME = "title";
public static final String KEY_NOTES = "lastcall";
private static final String DATABASE_NAME = "Champagnedb";
private static final String DATABASE_TABLE = "champagneTable";
private static final int DATABASE_VERSION = 1;
private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
private static class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub\
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_NAME
+ " TEXT NOT NULL);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
onCreate(db);
}
}
public MainActivityChampagne(Context c) {
ourContext = c;
}
public MainActivityChampagne open() {
ourHelper = new DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close() {
ourHelper.close();
}
public long createEntry(String titles, String notes) {
// TODO Auto-generated method stub
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, titles);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}
public ArrayList<String> getData() {
// TODO Auto-generated method stub
String[] columns = new String[] { KEY_NAME };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
null, null);
String result = "";
int iNotes = c.getColumnIndex(KEY_NAME);
ArrayList<String> string_array = new ArrayList<String>();
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
result = c.getString(iNotes) + "\n";
string_array.add(result);
}
return string_array;
}
public void updateEntry(String thetitles, String thenotes) {
// TODO Auto-generated method stub
ContentValues cvUpdate = new ContentValues();
cvUpdate.put(KEY_NAME, thetitles);
/* cvUpdate.put(KEY_NOTES, thenotes); */
/*
* ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_NAME + "=" +
* thetitles + KEY_NOTES + "=" + thenotes, null);
*/
ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_NAME + "='"
+ thetitles + "'", null);
}
}
MainActivityPaper.java
package android.application.project.planes;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
public class MainActivityPaper extends Activity implements OnClickListener {
TextView text1, title1;
Button save1, update1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main_activity_paper);
text1 = (TextView) findViewById(R.id.editText1);
title1 = (TextView) findViewById(R.id.editText3);
save1 = (Button) findViewById(R.id.button3);
update1 = (Button) findViewById(R.id.button5);
save1.setOnClickListener(this);
update1.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.button3:
String titles = title1.getText().toString();
String notes = text1.getText().toString();
MainActivityChampagne entry = new MainActivityChampagne(
MainActivityPaper.this);
entry.open();
entry.createEntry(titles, notes);
entry.close();
break;
case R.id.button5:
String thetitles = title1.getText().toString();
String thenotes = text1.getText().toString();
MainActivityChampagne up = new MainActivityChampagne(
MainActivityPaper.this);
up.open();
up.updateEntry(thetitles, thenotes);
up.close();
break;
}
}
}
MainActivityPlanes.java
package android.application.project.planes;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class MainActivityPlanes extends Activity {
Button Add;
ListView List;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main_activity_planes);
Add = (Button) findViewById(R.id.button1);
List = (ListView) findViewById(R.id.listView1);
List.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Intent launchActivity = new Intent(MainActivityPlanes.this,
MainActivityPaper.class);
startActivity(launchActivity);
}
});
Add.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(),
MainActivityPaper.class);
startActivityForResult(intent, 0);
}
});
MainActivityChampagne info = new MainActivityChampagne(this);
info.open();
ArrayList<String> data = info.getData();
info.close();
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, data);
List.setAdapter(arrayAdapter);
}
}
Here What is wrong in your code is SQLite Database queries. You are created only on row in that table and trying to compare two values while updating. You just check you code you will be able to modify according to that. Hope this will help.
Add the Following code to make your list-view on-click working
Add the following code in MainActivityPlanes.java
List.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
String str1 = List.getItemAtPosition(arg2).toString();
System.out.println(str1);
Bundle bucket = new Bundle();
bucket.putString("my_key", str1);
// TODO Auto-generated method stub
Intent launchActivity = new Intent(MainActivityPlanes.this,
MainActivityPaper.class);
launchActivity.putExtras(bucket);
startActivity(launchActivity);
}
});
Add the Following code in MainActivityPaper.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main_activity_paper);
text1 = (TextView) findViewById(R.id.editText1);
String s = null;
try{
Bundle b = this.getIntent().getExtras();
s= b.getString("my_key");
}catch(Exception e){
s="";
e.printStackTrace();
}finally{
text1.setText(s.toString());
}
title1 = (TextView) findViewById(R.id.editText3);
save1 = (Button) findViewById(R.id.button3);
update1 = (Button) findViewById(R.id.button5);
save1.setOnClickListener(this);
update1.setOnClickListener(this);
}
Hope this will solve your problem.
回答2:
This should be removed.
Intent launchActivity = new Intent(MainActivityPlanes.this, MainActivityChampagne.class);
startActivity(launchActivity);
And you have this
public class MainActivityChampagne
Your MainActivityChampagne class does not extend activity. It's a non activity class.
To set data to listview.
MainActivityChampagne db = new MainActivityChampagne(MainActivityPlanes.this);
db.open();
ArrayList<String> list = db.getData();
Now use the list to set the data to listview.
Define row.xml with a textview with id textView1.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivityPlanes.this, R.layout.row, R.id.textView1,list);
List = (ListView) findViewById(R.id.listView1);
List.setAdapter(adapter);
Once you set the adapter to listview.
List.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> listView, View itemView, int itemPosition, long itemId)
{
. // on list item click do what is necessary
}
});
Edit:
row.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="114dp"
android:layout_marginTop="30dp"
android:text="TextView" />
</RelativeLayout>
Snap shot
Edit2 : The update is fixed. However you need to modify the below according to your needs.
public class MainActivityChampagne {
public static final String KEY_NAME = "title";
public static final String KEY_NOTES = "lastcall";
private static final String DATABASE_NAME = "Champagnedb5";
private static final String DATABASE_TABLE = "champagneTable";
private static final int DATABASE_VERSION = 1;
private static final String KEY_ID = "id";
private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;
private static class DbHelper extends SQLiteOpenHelper{
public DbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub\
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
KEY_NAME + " TEXT NOT NULL," +
KEY_NOTES + " TEXT NOT NULL" + ");"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
onCreate(db);
}
}
public MainActivityChampagne(Context c){
ourContext = c;
}
public MainActivityChampagne open(){
ourHelper = new DbHelper(ourContext);
ourDatabase = ourHelper.getWritableDatabase();
return this;
}
public void close(){
ourHelper.close();
}
public long createEntry(String titles, String notes) {
// TODO Auto-generated method stub
ContentValues cv = new ContentValues();
cv.put(KEY_NAME, titles);
cv.put(KEY_NOTES, notes);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}
public ArrayList<String> getData() {
//TODO Auto-generated method stub
String[] columns = new String[] { KEY_NAME };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
String result = "";
int iNotes = c.getColumnIndex(KEY_NAME);
ArrayList<String> string_array = new ArrayList<String>();
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext())
{
result = c.getString (iNotes) + "\n";
string_array.add(result);
}
return string_array;
}
public void updateEntry(String thetitles, String thenotes) {
// TODO Auto-generated method stub
ContentValues cvUpdate = new ContentValues();
cvUpdate.put(KEY_NAME, thetitles);
cvUpdate.put(KEY_NOTES, thenotes);
ourDatabase.update(DATABASE_TABLE, cvUpdate, "id "+"="+1, null);
// this will update row 1 coz id is 1.
//ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_NAME + "=" + thetitles + KEY_NOTES + "=" + thenotes, null);
}
}
回答3:
Answering a question you didn't ask yet, but causing one of your problems is a missing declaration of MainActivityChampagne in your manifest. Needless to say, the crash log is correct (text search your manifest for "MainActivityChampagne" and you have zero hits).
来源:https://stackoverflow.com/questions/17227637/how-to-read-and-update-sqlite-database-using-listview-in-android