Reputation: 5
I need some help with my application. Everytime I try to save the values put into the text field my appliaction crashes ( after pressing button "save" ). I've created the following classes: This is my Main Activity class ( where I've got TabHost to switch beetwing activities - in this case days of the week).
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 ---//
}
}
This is my DatabaseHelper class:
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 ---//
This is my PoniedzialekActivity ( where I want on button click "Add" start a new intent where I am adding values to the database )
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);
}
}
}
And this is my dodawanieActivity, where I simply add values to the database
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();
}
}
This is my Poniedzialek class ( used to adding values into the database )
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;
}
}
And by the way, can anyone tell me how can I show on PoniedzialekActivity launch ( or switch, dunno ) show the values put into the database earlier - in a list.
On request, this is what Log said:
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)
The last thing, that I can't get working is displaying values put into database in my PoniedzialekActivity, could you tell me what should I do to get this working ? I am in dead end ( this is the last thing that I want to get working atm ). I tried doing something like that. Please help.
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);
}
}
}
Upvotes: 0
Views: 444
Reputation: 16393
Your table creation is mucked up. You are not using the constants you set and you are missing spaces (the last is the one that is killing your program).
This:
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);";
Should be this:
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);";
Repeat for all of your table creation statements.
Upvotes: 1