我的申请需要一些帮助。每当我尝试保存放入文本字段的值时,我的应用程序崩溃(按下“保存”按钮后)。 我创建了以下类: 这是我的主要活动课程(我有TabHost来切换beetwing活动 - 在这种情况下是一周中的几天)。
package com.projekt;
import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TabHost;
public class MainActivity extends TabActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//--- TABHOST ---//
Resources res = getResources(); // Resource object to get Drawables
TabHost tabHost = getTabHost(); // The activity TabHost
TabHost.TabSpec spec; // Resusable TabSpec for each tab
Intent intent; // Reusable Intent for each tab
// Create an Intent to launch an Activity for the tab (to be reused)
intent = new Intent().setClass(this, PoniedzialekActivity.class);
// Initialize a TabSpec for each tab and add it to the TabHost
spec = tabHost.newTabSpec("Pn").setIndicator("Pn",
res.getDrawable(R.drawable.ic_launcher))
.setContent(intent);
tabHost.addTab(spec);
// Do the same for the other tabs
intent = new Intent().setClass(this, WtorekActivity.class);
spec = tabHost.newTabSpec("Wt").setIndicator("Wt",
res.getDrawable(R.drawable.ic_launcher))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, SrodaActivity.class);
spec = tabHost.newTabSpec("Sr").setIndicator("Sr",
res.getDrawable(R.drawable.ic_launcher))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, CzwartekActivity.class);
spec = tabHost.newTabSpec("Cz").setIndicator("Cz",
res.getDrawable(R.drawable.ic_launcher))
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, PiatekActivity.class);
spec = tabHost.newTabSpec("Pt").setIndicator("Pt",
res.getDrawable(R.drawable.ic_launcher))
.setContent(intent);
tabHost.addTab(spec);
tabHost.setCurrentTab(0);
//--- END OF TABHOST ---//
}
}
这是我的DatabaseHelper类:
package com.projekt;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "database.db";
private static final int DATABASE_VERSION = 1;
public static final String TAG = "ProjectDatabase";
final static String PN_TABLE = "Tablica Poniedzialek";
static final String PN_KEY_ID = "_id";
final static String PN_KEY_NAME ="name";
final static String PN_KEY_TYPE_OF_SESSION ="type_of_session";
final static String PN_KEY_START_TIME ="start_time";
final static String PN_KEY_END_TIME ="end_time";
final static String PN_KEY_ROOM ="room";
static final String WT_TABLE = "Tablica Wtorek";
static final String WT_KEY_ID = "_id";
static final String WT_KEY_NAME ="name";
static final String WT_KEY_TYPE_OF_SESSION ="type_of_session";
static final String WT_KEY_START_TIME ="start_time";
static final String WT_KEY_END_TIME ="end_time";
static final String WT_KEY_ROOM ="room";
static final String SR_TABLE = "Tablica Sroda";
static final String SR_KEY_ID = "_id";
static final String SR_KEY_NAME ="name";
static final String SR_KEY_TYPE_OF_SESSION ="type_of_session";
static final String SR_KEY_START_TIME ="start_time";
static final String SR_KEY_END_TIME ="end_time";
static final String SR_KEY_ROOM ="room";
static final String CZ_TABLE = "Tablica Czwartek";
static final String CZ_KEY_ID = "_id";
static final String CZ_KEY_NAME ="name";
static final String CZ_KEY_TYPE_OF_SESSION ="type_of_session";
static final String CZ_KEY_START_TIME ="start_time";
static final String CZ_KEY_END_TIME ="end_time";
static final String CZ_KEY_ROOM ="room";
static final String PT_TABLE = "Tablica Piatek";
static final String PT_KEY_ID = "_id";
static final String PT_KEY_NAME ="name";
static final String PT_KEY_TYPE_OF_SESSION ="type_of_session";
static final String PT_KEY_START_TIME ="start_time";
static final String PT_KEY_END_TIME ="end_time";
static final String PT_KEY_ROOM ="room";
//--- KONSTRUKTOR ---//
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//--- POMOCNIK DO OTWIERANIA/AKTUALIZOWANIA BAZY DANYCH ---//
private DatabaseHelper dbhelper;
//--- ZMIENNA DO PRZECHOWYWANIA INSTANCJI BAZY DANYCH ---//
@SuppressWarnings("unused")
private SQLiteDatabase db;
//--- TWORZENIE TABLIC ---//
@Override
public void onCreate(SQLiteDatabase db) {
String pn_sql = "CREATE TABLE" + PN_TABLE +
"(PN_KEY_ID integer primary key autoincrement, " +
"PN_KEY_TYPE_OF_SESSION text, " +
"PN_KEY_NAME text, " +
"PN_KEY_START_TIME text, " +
"PN_KEY_END_TIME text, " +
"PN_KEY_ROOM text);";
String wt_sql = "CREATE TABLE" + WT_TABLE +
"(WT_KEY_ID integer primary key autoincrement, " +
"WT_KEY_TYPE_OF_SESSION text, " +
"WT_KEY_NAME text, " +
"WT_KEY_START_TIME text, " +
"WT_KEY_END_TIME text, " +
"WT_KEY_ROOM text);";
String sr_sql = "CREATE TABLE" + SR_TABLE +
"(SR_KEY_ID integer primary key autoincrement, " +
"SR_KEY_TYPE_OF_SESSION text, " +
"SR_KEY_NAME text, " +
"SR_KEY_START_TIME text, " +
"SR_KEY_END_TIME text, " +
"SR_KEY_ROOM text);";
String cz_sql = "CREATE TABLE" + CZ_TABLE +
"(CZ_KEY_ID integer primary key autoincrement, " +
"CZ_KEY_TYPE_OF_SESSION text, " +
"CZ_KEY_NAME text, " +
"CZ_KEY_START_TIME text, " +
"CZ_KEY_END_TIME text, " +
"CZ_KEY_ROOM text);";
String pt_sql = "CREATE TABLE" + PT_TABLE +
"(PT_KEY_ID integer primary key autoincrement, " +
"PT_KEY_TYPE_OF_SESSION text, " +
"PT_KEY_NAME text, " +
"PT_KEY_START_TIME text, " +
"PT_KEY_END_TIME text, " +
"PT_KEY_ROOM text);";
db.execSQL(pn_sql);
db.execSQL(wt_sql);
db.execSQL(sr_sql);
db.execSQL(cz_sql);
db.execSQL(pt_sql);
}
@Override
//--- ON UPGRADE ---//
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("Projekt", "aktualizacja z wersji " + oldVersion
+ " do wersji " + newVersion + " ( stare dane ulegna usunieciu ) ");
db.execSQL("DROP TABLE IF EXISTS" + PN_TABLE);
db.execSQL("DROP TABLE IF EXISTS" + WT_TABLE);
db.execSQL("DROP TABLE IF EXISTS" + SR_TABLE);
db.execSQL("DROP TABLE IF EXISTS" + CZ_TABLE);
db.execSQL("DROP TABLE IF EXISTS" + PT_TABLE);
onCreate(db);
}
//--- OPEN DATABASE ---//
public void open() throws SQLiteException
{
try
{
db = dbhelper.getWritableDatabase();
}
catch(SQLiteException ex)
{
db = dbhelper.getReadableDatabase();
}
}
//--- CLOSE DATABASE ---//
public void close()
{
dbhelper.close();
}
} //--- KONIEC KLASY DatabaseHelper ---//
这是我的PoniedzialekActivity(我想在按钮上点击“添加”开始一个新的意图,我在数据库中添加值)
package com.projekt;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class PoniedzialekActivity extends Activity implements OnClickListener {
private Button butPnAdd;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_poniedzialek);
butPnAdd = (Button) findViewById(R.id.butPnAdd);
butPnAdd.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.butPnAdd){
Intent i = new Intent(PoniedzialekActivity.this,dodawaniePoniedzialek.class);
startActivity(i);
}
}
}
这是我的dodawanieActivity,我只是在数据库中添加值
package com.projekt;
import java.util.ArrayList;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class dodawaniePoniedzialek extends Activity implements OnClickListener{
private EditText TypeOfSessionEditText;
private EditText NameEditText;
private EditText StartTimeEditText;
private EditText EndTimeEditText;
private EditText RoomEditText;
private Button cancelButton;
private Button saveButton;
private ArrayList<Poniedzialek> pn_list;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dodawanie);
TypeOfSessionEditText = (EditText) findViewById(R.id.editText1);
NameEditText = (EditText) findViewById(R.id.editText2);
StartTimeEditText = (EditText) findViewById(R.id.editText3);
EndTimeEditText = (EditText) findViewById(R.id.editText4);
RoomEditText = (EditText) findViewById(R.id.editText5);
cancelButton = (Button) findViewById(R.id.cancelButton);
cancelButton.setOnClickListener(this);
saveButton = (Button) findViewById(R.id.saveButton);
saveButton.setOnClickListener(this);
pn_list = new ArrayList<Poniedzialek>(); // dodano <Poniedzialek>
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.cancelButton){
// finish();
Intent i = new Intent(dodawaniePoniedzialek.this,MainActivity.class);
startActivity(i);
}else if(v.getId() == R.id.saveButton){
// Pobiera wartosci podane przez uzytkownika
String providedTypeOfSession = TypeOfSessionEditText.getText().toString();
String providedName = NameEditText.getText().toString();
String provideStartTime = StartTimeEditText.getText().toString();
String provideEndTime = EndTimeEditText.getText().toString();
String provideRoom = RoomEditText.getText().toString();
// Przekazuje powyzsze wartosci do metod set w klasie Poniedzialek
Poniedzialek pn = new Poniedzialek();
pn.setTypeOfSession(providedTypeOfSession);
pn.setName(providedName);
pn.setStartTime(provideStartTime);
pn.setEndTime(provideEndTime);
pn.setRoom(provideRoom);
// Dodaj do listy
pn_list.add(pn);
// Dodaj do bazy
addPnSession(pn);
// Wyjdz z istniejacego UI i wroc do poprzedniego UI
// finish();
Intent i = new Intent(dodawaniePoniedzialek.this,MainActivity.class);
startActivity(i);
}
}
// metoda dodawania do bazy danych
public void addPnSession(Poniedzialek pn){
DatabaseHelper dbhelper = new DatabaseHelper(this);
SQLiteDatabase db = dbhelper.getWritableDatabase();
ContentValues pn_values = new ContentValues();
pn_values.put(DatabaseHelper.PN_KEY_TYPE_OF_SESSION,pn.getTypeOfSession());
pn_values.put(DatabaseHelper.PN_KEY_NAME, pn.getName());
pn_values.put(DatabaseHelper.PN_KEY_START_TIME,pn.getStartTime());
pn_values.put(DatabaseHelper.PN_KEY_END_TIME, pn.getEndTime());
pn_values.put(DatabaseHelper.PN_KEY_ROOM,pn.getRoom());
db.insert(DatabaseHelper.PN_TABLE, null, pn_values);
db.close();
}
}
这是我的Poniedzialek类(用于在数据库中添加值)
package com.projekt;
public class Poniedzialek {
//private variables
int id;
String name;
String start_time;
String end_time;
String type_of_session;
String room;
// pusty constructor
public Poniedzialek(){
}
// constructor
public Poniedzialek(int id, String name,String start_time,String end_time,String type_of_session,String room){
this.id = id;
this.type_of_session = type_of_session;
this.name = name;
this.start_time = start_time;
this.end_time = end_time;
this.room = room;
}
// getting ID
public int getID(){
return this.id;
}
// setting id
public void setID(int id){
this.id = id;
}
// getting name
public String getName(){
return this.name;
}
// setting name
public void setName(String name){
this.name = name;
}
// getting start time
public String getStartTime(){
return this.start_time;
}
// setting start time
public void setStartTime(String start_time){
this.start_time = start_time;
}
// getting end time
public String getEndTime(){
return this.end_time;
}
// setting end time
public void setEndTime(String end_time){
this.end_time = end_time;
}
// getting type of session
public String getTypeOfSession(){
return this.type_of_session;
}
// setting type of session
public void setTypeOfSession(String type_of_session){
this.type_of_session = type_of_session;
}
// getting room
public String getRoom(){
return this.room;
}
// setting room
public void setRoom(String room){
this.room = room;
}
}
顺便说一句,任何人都可以告诉我如何在PoniedzialekActivity启动(或切换,dunno)上显示之前放入数据库的值 - 在列表中。
根据要求,这就是Log所说的:
06-11 13:08:49.104: D/PhoneWindow(331): couldn't save which view has focus because the focused view com.android.internal.policy.impl.PhoneWindow$DecorView@405222a8 has no id.
06-11 13:08:50.784: I/Database(331): sqlite returned: error code = 1, msg = near "TABLETablica_Poniedzialek": syntax error
06-11 13:08:50.784: E/Database(331): Failure 1 (near "TABLETablica_Poniedzialek": syntax error) on 0x2da910 when preparing 'CREATE TABLETablica_Poniedzialek(PN_KEY_ID integer primary key autoincrement, PN_KEY_TYPE_OF_SESSION text, PN_KEY_NAME text, PN_KEY_START_TIME text, PN_KEY_END_TIME text, PN_KEY_ROOM text);'.
06-11 13:08:50.804: D/AndroidRuntime(331): Shutting down VM
06-11 13:08:50.804: W/dalvikvm(331): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-11 13:08:50.815: E/AndroidRuntime(331): FATAL EXCEPTION: main
06-11 13:08:50.815: E/AndroidRuntime(331): android.database.sqlite.SQLiteException: near "TABLETablica_Poniedzialek": syntax error: CREATE TABLETablica_Poniedzialek(PN_KEY_ID integer primary key autoincrement, PN_KEY_TYPE_OF_SESSION text, PN_KEY_NAME text, PN_KEY_START_TIME text, PN_KEY_END_TIME text, PN_KEY_ROOM text);
06-11 13:08:50.815: E/AndroidRuntime(331): at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
06-11 13:08:50.815: E/AndroidRuntime(331): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1763)
06-11 13:08:50.815: E/AndroidRuntime(331): at com.projekt.DatabaseHelper.onCreate(DatabaseHelper.java:117)
06-11 13:08:50.815: E/AndroidRuntime(331): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:126)
06-11 13:08:50.815: E/AndroidRuntime(331): at com.projekt.dodawaniePoniedzialek.addPnSession(dodawaniePoniedzialek.java:79)
06-11 13:08:50.815: E/AndroidRuntime(331): at com.projekt.dodawaniePoniedzialek.onClick(dodawaniePoniedzialek.java:69)
06-11 13:08:50.815: E/AndroidRuntime(331): at android.view.View.performClick(View.java:2485)
06-11 13:08:50.815: E/AndroidRuntime(331): at android.view.View$PerformClick.run(View.java:9080)
06-11 13:08:50.815: E/AndroidRuntime(331): at android.os.Handler.handleCallback(Handler.java:587)
06-11 13:08:50.815: E/AndroidRuntime(331): at android.os.Handler.dispatchMessage(Handler.java:92)
06-11 13:08:50.815: E/AndroidRuntime(331): at android.os.Looper.loop(Looper.java:123)
06-11 13:08:50.815: E/AndroidRuntime(331): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-11 13:08:50.815: E/AndroidRuntime(331): at java.lang.reflect.Method.invokeNative(Native Method)
06-11 13:08:50.815: E/AndroidRuntime(331): at java.lang.reflect.Method.invoke(Method.java:507)
06-11 13:08:50.815: E/AndroidRuntime(331): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-11 13:08:50.815: E/AndroidRuntime(331): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-11 13:08:50.815: E/AndroidRuntime(331): at dalvik.system.NativeStart.main(Native Method)
最后一点,我无法正常工作是在我的PoniedzialekActivity中显示放入数据库的值,你能告诉我应该怎么做才能让它工作吗?我处于死胡同(这是我想要工作的最后一件事)。我尝试过这样的事情。请帮忙。
package com.projekt;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
public class PoniedzialekActivity extends ListActivity implements OnClickListener { // now Extends ListActivity instead of Activity
/* ADDED */
private DatabaseHelper dbhelper;
private SQLiteDatabase db;
/* DEDDA */
private Button butPnAdd;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_poniedzialek);
butPnAdd = (Button) findViewById(R.id.butPnAdd);
butPnAdd.setOnClickListener(this);
List<Poniedzialek> values = showPn();
// Use the SimpleCursorAdapter to show the
// elements in a ListView
ArrayAdapter<Poniedzialek> pn_adapter = new ArrayAdapter<Poniedzialek>(this,
android.R.layout.simple_list_item_1, values);
setListAdapter(pn_adapter);
}
/* ADDED */
public List<Poniedzialek> showPn(){
List<Poniedzialek> pn_list = new ArrayList<Poniedzialek>();
Cursor cursor = db.query(DatabaseHelper.PN_TABLE, null, null, null, null, null, null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Poniedzialek pn = cursorToPoniedzialek(cursor);
pn_list.add(pn);
cursor.moveToNext();
}
// Make sure to close the cursor
cursor.close();
return pn_list;
}
private Poniedzialek cursorToPoniedzialek(Cursor cursor) {
Poniedzialek pn = new Poniedzialek();
pn.setID(cursor.getInt(0));
pn.setStartTime(cursor.getString(1));
pn.setEndTime(cursor.getString(2));
pn.setTypeOfSession(cursor.getString(3));
pn.setName(cursor.getString(4));
pn.setRoom(cursor.getString(5));
return pn;
}
/* DEDDA */
@Override
public void onClick(View v) {
if(v.getId()==R.id.butPnAdd){
Intent i = new Intent(PoniedzialekActivity.this,dodawaniePoniedzialek.class);
startActivity(i);
}
}
}
答案 0 :(得分:1)
你的桌子创建被破坏了。你没有使用你设置的常量而你缺少空格(最后一个是杀死你的程序的那个)。
此:
String pn_sql = "CREATE TABLE" + PN_TABLE +
"(PN_KEY_ID integer primary key autoincrement, " +
"PN_KEY_TYPE_OF_SESSION text, " +
"PN_KEY_NAME text, " +
"PN_KEY_START_TIME text, " +
"PN_KEY_END_TIME text, " +
"PN_KEY_ROOM text);";
应该是这样的:
String pn_sql = "CREATE TABLE " + PN_TABLE +
"(" + PN_KEY_ID + " integer primary key autoincrement, " +
PN_KEY_TYPE_OF_SESSION + " text, " +
PN_KEY_NAME + " text, " +
PN_KEY_START_TIME + " text, " +
PN_KEY_END_TIME + " text, " +
PN_KEY_ROOM + " text);";
对所有表创建语句重复。