I have created a simple Android application which asks for the users information such as name, blood type, contact number, etc., saves it in a database, and displays it in another screen. This is all suppose to happen when the save button is clicked which invokes the saveMe() method. However, when I click the save button, the app does not crash and close instead it gets stuck and then in the logcat I see something like:
08-08 22:41:23.734: D/dalvikvm(365): GC_FOR_MALLOC freed 321K, 50% free 2984K/5959K, external 716K/1038K, paused 18ms
08-08 22:41:23.754: D/dalvikvm(365): GC_FOR_MALLOC freed 322K, 50% free 2984K/5959K, external 716K/1038K, paused 18ms
08-08 22:41:23.784: D/dalvikvm(365): GC_FOR_MALLOC freed 323K, 50% free 2984K/5959K, external 716K/1038K, paused 21ms
08-08 22:41:23.804: D/dalvikvm(365): GC_FOR_MALLOC freed 324K, 50% free 2984K/5959K, external 716K/1038K, paused 19ms
08-08 22:41:23.824: D/dalvikvm(365): GC_FOR_MALLOC freed 324K, 50% free 2984K/5959K, external 716K/1038K, paused 20ms
08-08 22:41:23.844: D/dalvikvm(365): GC_FOR_MALLOC freed 325K, 50% free 2984K/5959K, external 716K/1038K, paused 20ms
08-08 22:41:23.874: D/dalvikvm(365): GC_FOR_MALLOC freed 326K, 50% free 2984K/5959K, external 716K/1038K, paused 25ms
08-08 22:41:23.894: D/dalvikvm(365): GC_FOR_MALLOC freed 327K, 50% free 2984K/5959K, external 716K/1038K, paused 23ms
08-08 22:41:23.934: D/dalvikvm(365): GC_FOR_MALLOC freed 327K, 50% free
These messages keep appearing in log cat. The only way I can stop them is if I close the emulator. Is the app getting stuck in a infinite loop? No data get saved or displayed.
Database Class
package com.example.androidsimpledbapp1;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.Cursor;
import android.content.Context;
import android.content.ContentValues;
public class MyDBHandler extends SQLiteOpenHelper {
/*
* Class for Working with DB
*/
//Update each time DB structure changes e.g. adding new property
private static final int DATABASE_VERSION =1;
//DB Name
private static final String DATABASE_NAME = "deets.db";
//Table name
public static final String TABLE_PRODUCTS = "products";
//DB Columns
public static final String COLUMN_ID = "_Id";
public static final String COLUMN_PERSONNAME = "firstName";
public static final String COLUMN_PERSONBLOOD = "bloodType";
public static final String COLUMN_PERSONCONTACT = "contactName";
public static final String COLUMN_PERSONNUMBER = "phoneNumber";
public static final String COLUMN_PERSONRELATION = "relationship";
//Constructor
/*
* Passing information to super class in SQL
* Context is background information
* name of db
* Database version
*/
public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
/*
* What to do first time when you create DB
* Creates the table the very first time
* (non-Javadoc)
* #see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
* Remember to use Commas as shown below
*/
#Override
public void onCreate(SQLiteDatabase db){
String query = "CREATE TABLE "+ TABLE_PRODUCTS + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
COLUMN_PERSONNAME + " TEXT, "+
COLUMN_PERSONBLOOD + " TEXT, "+
COLUMN_PERSONCONTACT + " TEXT, "+
COLUMN_PERSONNUMBER + " TEXT, " +
COLUMN_PERSONRELATION + " TEXT " +
");";
//Execute the query
db.execSQL(query);
}
/*
* If ever upgrading DB call this method
* (non-Javadoc)
* #see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
*/
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
//Delete the current table
db.execSQL("DROP TABLE IF EXISTS" + TABLE_PRODUCTS);
//create new table
onCreate(db);
}
//Add new row to the database
public void addProduct(Details details){
//Built in class - set values for different columns
//Makes inserting rows quick and easy
ContentValues values = new ContentValues();
values.put(COLUMN_PERSONNAME, details.get_firstName());
values.put(COLUMN_PERSONBLOOD, details.get_bloodType());
values.put(COLUMN_PERSONCONTACT, details.get_contactName());
values.put(COLUMN_PERSONNUMBER, details.get_phoneNumber());
values.put(COLUMN_PERSONRELATION, details.get_relationship());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_PRODUCTS, null, values);
db.close();
}
/*
public void deleteProducts(){
SQLiteDatabase = getWritableDatabase();
db.execSQL("DROP TABLE");
How to delete the database...
}
*/
//Take DB and Convert to String
public String databaseToString(){
String dbString = "";
SQLiteDatabase db = getWritableDatabase();
//Every Column and row
String query = "SELECT * FROM " + TABLE_PRODUCTS + " WHERE 1";
//Cursor points to a location in your results
//First row point here, second row point here
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
while(!c.isAfterLast()){
//Extracts first name and adds to string
if(c.getString(c.getColumnIndex("firstName"))!=null){
dbString += c.getString(c.getColumnIndex("firstName"));
/*
* Displaying all other columns
*/
}
}
db.close();
return dbString;
}
}
Details Class
package com.example.androidsimpledbapp1;
public class Details {
//primary key
private int _id;
//Properties
private String _firstName;
private String _bloodType;
private String _contactName;
private String _phoneNumber;
private String _relationship;
//Dont Have to Enter Everything each time
public Details(){
}
public Details(String firstName){
this.set_firstName(firstName);
}
//Passing in details
//Setting values from the user
public Details(String firstName, String bloodType,
String contactName, String phoneNumber,
String relationship){
this.set_firstName(firstName);
this.set_bloodType(bloodType);
this.set_contactName(contactName);
this.set_phoneNumber(phoneNumber);
this.set_relationship(relationship);
}
//Retrieve the data
public int get_id() {
return _id;
}
//Setter allows to give property
public void set_id(int _id) {
this._id = _id;
}
public String get_firstName() {
return _firstName;
}
public void set_firstName(String _firstName) {
this._firstName = _firstName;
}
public String get_bloodType() {
return _bloodType;
}
public void set_bloodType(String _bloodType) {
this._bloodType = _bloodType;
}
public String get_contactName() {
return _contactName;
}
public void set_contactName(String _contactName) {
this._contactName = _contactName;
}
public String get_phoneNumber() {
return _phoneNumber;
}
public void set_phoneNumber(String _phoneNumber) {
this._phoneNumber = _phoneNumber;
}
public String get_relationship() {
return _relationship;
}
public void set_relationship(String _relationship) {
this._relationship = _relationship;
}
}
Edit Screen - Where the save button is clicked
public class EditScreen extends Activity {
EditText firstNameInput;
EditText bloodTypeInput;
EditText contacNameInput;
EditText phoneNumberInput;
EditText relationshipInput;
TextView displayName;
MyDBHandler dbHandler;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_screen);
firstNameInput = (EditText) findViewById(R.id.inputname);
bloodTypeInput = (EditText) findViewById(R.id.inputblood);
contacNameInput = (EditText) findViewById(R.id.inputcontact);
phoneNumberInput = (EditText) findViewById(R.id.inputnum);
relationshipInput = (EditText) findViewById(R.id.inputraltion);
displayName = (TextView) findViewById(R.id.dbname);
dbHandler = new MyDBHandler(this, null, null, 1);
}
/*
* Causing error fix the error
*/
public void saveMe(View v){
Details detail = new Details(firstNameInput.getText().toString(),
bloodTypeInput.getText().toString(),
contacNameInput.getText().toString(),
phoneNumberInput.getText().toString(),
relationshipInput.getText().toString()
);
dbHandler.addProduct(detail);
printDatabase();
}
private void printDatabase() {
//Taking the string
String dbString = dbHandler.databaseToString();
//Display in the textview
displayName.setText(dbString);
}
}
Main Activity
package com.example.androidsimpledbapp1;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//Changing Activity
public void editBtnPressed(View v){
Intent intent = new Intent(MainActivity.this, EditScreen.class);
startActivity(intent);
}
}
Logcat - Error
08-08 22:41:00.034: D/AndroidRuntime(348): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
08-08 22:41:00.054: D/AndroidRuntime(348): CheckJNI is ON
08-08 22:41:00.273: I/ActivityManager(60): Start proc com.svox.pico for broadcast com.svox.pico/.VoiceDataInstallerReceiver: pid=350 uid=10028 gids={}
08-08 22:41:00.583: I/ActivityThread(350): Pub com.svox.pico.providers.SettingsProvider: com.svox.pico.providers.SettingsProvider
08-08 22:41:00.663: D/GTalkService(185): handlePackageInstalled: re-initialize providers
08-08 22:41:00.663: D/GTalkService(185): [RawStanzaProvidersMgr] ##### searchProvidersFromIntent
08-08 22:41:00.663: D/GTalkService(185): [RawStanzaProvidersMgr] no intent receivers found
08-08 22:41:00.713: D/dalvikvm(335): GC_CONCURRENT freed 211K, 43% free 3575K/6215K, external 716K/1038K, paused 3ms+4ms
08-08 22:41:00.874: D/AndroidRuntime(348): Calling main entry com.android.commands.am.Am
08-08 22:41:00.904: I/ActivityManager(60): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.androidsimpledbapp1/.MainActivity } from pid 348
08-08 22:41:00.974: D/AndroidRuntime(348): Shutting down VM
08-08 22:41:00.984: I/ActivityManager(60): Start proc com.example.androidsimpledbapp1 for activity com.example.androidsimpledbapp1/.MainActivity: pid=365 uid=10045 gids={}
08-08 22:41:00.994: D/dalvikvm(348): GC_CONCURRENT freed 101K, 69% free 318K/1024K, external 0K/0K, paused 1ms+1ms
08-08 22:41:01.004: D/jdwp(348): adbd disconnected
08-08 22:41:01.154: D/dalvikvm(32): GC_EXPLICIT freed 11K, 50% free 2719K/5379K, external 716K/1038K, paused 168ms
08-08 22:41:01.214: D/dalvikvm(32): GC_EXPLICIT freed <1K, 50% free 2719K/5379K, external 716K/1038K, paused 62ms
You're missing c.moveToNext() in your databaseToString() while loop and the loop never terminates.
Related
I have made a simple app which saves and displays bookmarks.
The view bookmarks activity is called by clicking on a menu item in the main activity.
The problem is that when I click the option to view bookmarks stored in view bookmarks Activity, my app crashes.
The problem, I think, is with the bookmark Activity because I have an unused import statement AdapterView.OnItemClickListener & content.Context.
How do I solve this issue?
PS: when I click the option in the main Activity to save a bookmark by launching the save bookmark Activity, it works perfectly.
Here is my code:
BookmarkPage.class
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import java.util.ArrayList;
public class BookmarkPage extends Activity {
public final static String EXTRA_MESSAGE = "MESSAGE";
private ListView obj;
DBHelper mydb;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bookmark_page);
mydb = new DBHelper(this);
ArrayList array_list = mydb.getAllBookmarks();
ArrayAdapter arrayAdapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1, array_list);
obj = (ListView)findViewById(R.id.listView1);
obj.setAdapter(arrayAdapter);
obj.setOnItemClickListener(new AdapterView.OnItemClickListener(){
#Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
// TODO Auto-generated method stub
int id_To_Search = arg2 + 1;
Bundle dataBundle = new Bundle();
dataBundle.putInt("id", id_To_Search);
Intent intent = new Intent(getApplicationContext(),DisplayBookmarks.class);
intent.putExtras(dataBundle);
startActivity(intent);
}
});
}
public boolean onKeyDown(int keycode, KeyEvent event) {
if (keycode == KeyEvent.KEYCODE_BACK) {
moveTaskToBack(true);
}
return super.onKeyDown(keycode, event);
}
}
bookmark_page.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=".BookmarkPage">
<TextView
android:id="#+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="Bookmarks"
android:textSize="30sp" />
<ListView
android:id="#+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="#+id/textView">
</ListView>
</RelativeLayout>
Logcat:
OpenGL ES Shader Compiler Version: E031.25.03.00
Build Date: 12/04/14 Thu
Local Branch:
Remote Branch: quic/LA.BF.1.1_rb1.14
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.030 + NOTHING
10-03 18:10:35.793 18581-18642/com.carsaleindiaofficial.csitestapp W/cr.media﹕ Requires BLUETOOTH permission
10-03 18:10:35.830 18581-18581/com.carsaleindiaofficial.csitestapp E/libEGL﹕ validate_display:255 error 3008 (EGL_BAD_DISPLAY)
10-03 18:10:35.890 18581-18581/com.carsaleindiaofficial.csitestapp I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.FloatingSelectActionModeCallback>
10-03 18:10:35.891 18581-18581/com.carsaleindiaofficial.csitestapp I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.FloatingSelectActionModeCallback>
10-03 18:10:35.922 18581-18581/com.carsaleindiaofficial.csitestapp I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.WebViewContentsClientAdapter$WebResourceErrorImpl>
10-03 18:10:35.922 18581-18581/com.carsaleindiaofficial.csitestapp I/art﹕ Rejecting re-init on previously-failed class java.lang.Class<com.android.webview.chromium.WebViewContentsClientAdapter$WebResourceErrorImpl>
10-03 18:10:36.276 18581-18581/com.carsaleindiaofficial.csitestapp W/art﹕ Attempt to remove local handle scope entry from IRT, ignoring
10-03 18:10:36.318 18581-18581/com.carsaleindiaofficial.csitestapp W/AwContents﹕ onDetachedFromWindow called when already detached. Ignoring
10-03 18:10:36.836 18581-18681/com.carsaleindiaofficial.csitestapp D/OpenGLRenderer﹕ Render dirty regions requested: true
10-03 18:10:36.902 18581-18581/com.carsaleindiaofficial.csitestapp D/Atlas﹕ Validating map...
10-03 18:10:36.944 18581-18639/com.carsaleindiaofficial.csitestapp W/chromium﹕ [WARNING:data_reduction_proxy_config.cc(630)] SPDY proxy OFF at startup
10-03 18:10:37.192 18581-18681/com.carsaleindiaofficial.csitestapp I/OpenGLRenderer﹕ Initialized EGL, version 1.4
10-03 18:10:37.201 18581-18681/com.carsaleindiaofficial.csitestapp D/OpenGLRenderer﹕ Enabling debug mode 0
10-03 18:10:38.109 18581-18581/com.carsaleindiaofficial.csitestapp I/Choreographer﹕ Skipped 49 frames! The application may be doing too much work on its main thread.
10-03 18:10:38.213 18581-18581/com.carsaleindiaofficial.csitestapp I/progressBar﹕ Visible
10-03 18:10:38.222 18581-18596/com.carsaleindiaofficial.csitestapp I/art﹕ Background sticky concurrent mark sweep GC freed 10653(792KB) AllocSpace objects, 6(92KB) LOS objects, 12% free, 6MB/7MB, paused 1.507ms total 130.800ms
10-03 18:10:38.894 18581-18581/com.carsaleindiaofficial.csitestapp W/cr.BindingManager﹕ Cannot call determinedVisibility() - never saw a connection for the pid: 18581
10-03 18:10:41.925 18581-18596/com.carsaleindiaofficial.csitestapp I/art﹕ Background partial concurrent mark sweep GC freed 12880(607KB) AllocSpace objects, 1(39KB) LOS objects, 40% free, 7MB/11MB, paused 1.053ms total 158.419ms
10-03 18:10:42.812 18581-18581/com.carsaleindiaofficial.csitestapp W/cr.BindingManager﹕ Cannot call determinedVisibility() - never saw a connection for the pid: 18581
10-03 18:10:43.549 18581-18581/com.carsaleindiaofficial.csitestapp W/cr.BindingManager﹕ Cannot call determinedVisibility() - never saw a connection for the pid: 18581
Problem Starts after progressbar:Gone (i.e when I press the view saved bookmarks option)
10-03 21:13:12.096 18489-18489/com.carsaleindiaofficial.csitestapp I/pageFinished﹕ yesss
10-03 21:13:12.353 18489-18489/com.carsaleindiaofficial.csitestapp I/progressBar﹕ Gone
10-03 21:13:26.413 18489-18489/com.carsaleindiaofficial.csitestapp I/Choreographer﹕ Skipped 64 frames! The application may be doing too much work on its main thread.
10-03 21:13:28.701 18489-18489/com.carsaleindiaofficial.csitestapp W/art﹕ Before Android 4.1, method int android.support.v7.internal.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
10-03 21:13:30.289 18489-18489/com.carsaleindiaofficial.csitestapp I/Choreographer﹕ Skipped 129 frames! The application may be doing too much work on its main thread.
10-03 21:13:31.604 18489-18489/com.carsaleindiaofficial.csitestapp I/Choreographer﹕ Skipped 78 frames! The application may be doing too much work on its main thread.
10-03 21:13:33.328 18489-18489/com.carsaleindiaofficial.csitestapp I/Choreographer﹕ Skipped 80 frames! The application may be doing too much work on its main thread.
10-03 21:13:35.714 18489-18489/com.carsaleindiaofficial.csitestapp I/Choreographer﹕ Skipped 38 frames! The application may be doing too much work on its main thread.
10-03 21:13:36.532 18489-18489/com.carsaleindiaofficial.csitestapp I/Choreographer﹕ Skipped 44 frames! The application may be doing too much work on its main thread.
10-03 21:13:37.719 18489-18489/com.carsaleindiaofficial.csitestapp E/CursorWindow﹕ Failed to read row 0, column -1 from a CursorWindow which has 9 rows, 2 columns.
10-03 21:13:37.777 18489-18489/com.carsaleindiaofficial.csitestapp D/AndroidRuntime﹕ Shutting down VM
10-03 21:13:37.892 18489-18489/com.carsaleindiaofficial.csitestapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.carsaleindiaofficial.csitestapp, PID: 18489
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.carsaleindiaofficial.csitestapp/com.carsaleindiaofficial.csitestapp.BookmarkPage}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
at android.app.ActivityThread.access$800(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:438)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at com.carsaleindiaofficial.csitestapp.DBHelper.getAllBookmarks(DBHelper.java:90)
at com.carsaleindiaofficial.csitestapp.BookmarkPage.onCreate(BookmarkPage.java:32)
at android.app.Activity.performCreate(Activity.java:5953)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
at android.app.ActivityThread.access$800(ActivityThread.java:148)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5312)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
10-03 21:13:43.601 18489-18489/com.carsaleindiaofficial.csitestapp I/Process﹕ Sending signal. PID: 18489 SIG: 9
My database: DBHelper.class
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase;
public class DBHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "MyDBName.db";
public static final String BOOKMARKS_TABLE_NAME = "bookmarks";
public static final String BOOKMARKS_COLUMN_ID = "id";
public static final String BOOKMARKS_COLUMN_NAME = "bmtitle";
private HashMap hp;
public DBHelper(Context context)
{
super(context, DATABASE_NAME , null, 1);
}
#Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(
"create table bookmarks " +
"(id integer primary key, bmtitle text)"
);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS bookmarks");
onCreate(db);
}
public boolean insertBookmark (String title)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("dbtitle", title);
db.insert("bookmarks", null, contentValues);
return true;
}
public Cursor getData(int id){
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery( "select * from bookmarks where id="+id+"", null );
return res;
}
public int numberOfRows(){
SQLiteDatabase db = this.getReadableDatabase();
int numRows = (int) DatabaseUtils.queryNumEntries(db, BOOKMARKS_TABLE_NAME);
return numRows;
}
public boolean updateBookmark (Integer id, String title)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", title);
db.update("bookmarks", contentValues, "id = ? ", new String[] { Integer.toString(id) } );
return true;
}
public Integer deleteBookmark (Integer id)
{
SQLiteDatabase db = this.getWritableDatabase();
return db.delete("bookmarks",
"id = ? ",
new String[] { Integer.toString(id) });
}
public ArrayList<String> getAllBookmarks()
{
ArrayList<String> array_list = new ArrayList<String>();
//hp = new HashMap();
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery( "select * from bookmarks", null );
res.moveToFirst();
while(res.isAfterLast() == false){
array_list.add(res.getString(res.getColumnIndex(BOOKMARKS_COLUMN_NAME)));
res.moveToNext();
}
return array_list;
}
}
MainActivity.class
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.ProgressBar;
#SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends AppCompatActivity {
private WebView view;
ProgressBar progressBar;
ImageView im;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setLogo(R.drawable.ic_launcher);
getSupportActionBar().setDisplayUseLogoEnabled(true);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar) this.findViewById(R.id.progressBar1);
im = (ImageView) this.findViewById(R.id.imageView2);
String url = "http://www.carsaleindiaofficial.com/?m=1";
view = (WebView) this.findViewById(R.id.webView);
view.setWebViewClient(new MyWebViewClient());
view.getSettings().setJavaScriptEnabled(true);
view.getSettings().setDomStorageEnabled(true);
view.loadUrl(url);
}
public class MyWebViewClient extends WebViewClient {
#Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.i("pageFinished", "yesss");
progressBar.setVisibility(View.GONE);
im.setVisibility(View.GONE);
Log.i("progressBar", "Gone");
}
#Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
progressBar.setVisibility(View.VISIBLE);
Log.i("progressBar", "Visible");
super.onPageStarted(view, url, favicon);
}
#Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(Uri.parse(url).getHost().endsWith("carsaleindiaofficial.com")) {
Log.i("ShldOvrideUrl", "CSI");
return false;
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
view.getContext().startActivity(intent);
Log.i("ShldOvrideUrl", "OtherSite");
return true;
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item){
super.onOptionsItemSelected(item);
switch(item.getItemId())
{
case R.id.add_bookmark:
Bundle dataBundle = new Bundle();
dataBundle.putInt("id", 0);
Log.i("addBookmark", "loadingAddBookmark");
Intent intent = new Intent(getApplicationContext(),DisplayBookmarks.class);
intent.putExtras(dataBundle);
startActivity(intent);
return true;
case R.id.show_bookmark:
Log.i("showBookmark", "loadingShowBookmark");
Intent intent2 = new Intent(getApplicationContext(),BookmarkPage.class);
startActivity(intent2);
return true;
case R.id.action_reload:
Log.i("actionReload", "ReloadingURL");
view.loadUrl(view.getUrl());
default:
return super.onOptionsItemSelected(item);
}
}
#Override
public void onBackPressed() {
if (view.canGoBack()) {
view.goBack();
} else {
super.onBackPressed();
}
}
}
Here's your error:
Failed to read row 0, column -1 from a CursorWindow which has 9 rows, 2 columns. ... Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
This is because you create this table:
#Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(
"create table bookmarks " +
"(id integer primary key, dbtitle text)"
);
}
Then you try to access a non existing column:
while(res.isAfterLast() == false){
array_list.add(res.getString(res.getColumnIndex(BOOKMARKS_COLUMN_NAME)));
res.moveToNext();
}
Which is defined as a string constant:
public static final String BOOKMARKS_COLUMN_NAME = "bmtitle";
But it's not created as a table column.
column -1 says that there's no column called bmtitle in your table.
And it's right, because, instead, there is a column named dbtitle.
Quick fix:
Simply change
public static final String BOOKMARKS_COLUMN_NAME = "bmtitle";
to
public static final String BOOKMARKS_COLUMN_NAME = "dbtitle";
Trying to retrieve the data from sqLite and show it in Alert Dialog Builder.
But not Showing the data at all. When I click on the View Button nothing happens.
MainActivity.java
package com.example.database;
import android.support.v7.app.ActionBarActivity;
import android.text.Editable;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity{
EditText first,last,age,classc;
Button add,view;
String FirstName;
String LastName;
String Class;
Integer Age;
sqLit myDB;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDB = new sqLit(this);
Link();
addButtonClicked();
viewButtonClicked();
}
public void addButtonClicked()
{
add.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
xmlToVar();
Integer flag=myDB.insertValue(FirstName, LastName, Class, Age);
if (flag==1)
{
Context context=MainActivity.this;
Toast toast = Toast.makeText(context, "Record Added" , Toast.LENGTH_LONG);
toast.show();
}
else
{
Context context=MainActivity.this;
Toast toast = Toast.makeText(context, "Error Occured" , Toast.LENGTH_LONG);
toast.show();
}
}
});
}
public void viewButtonClicked()
{
view.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Cursor res = myDB.getData();
if (res.getCount()==0)
{
showMessage("Error" , "No Data Found");
return;
}
StringBuffer buffer = new StringBuffer();
while (res.moveToNext())
{
buffer.append("ID : " + res.getString(0) + "\n");
buffer.append("FirstName : " + res.getString(1) + "\n");
buffer.append("LastName : " + res.getString(2) + "\n");
buffer.append("Class : " + res.getString(3) + "\n");
buffer.append("Age : " + res.getString(4) + "\n");
showMessage("Here is your Data",buffer.toString() );
}
}
});
}
public void showMessage(String title, String message)
{
AlertDialog.Builder Builder = new AlertDialog.Builder(this);
Builder.setCancelable(true);
Builder.setTitle(title);
Builder.setMessage(message);
}
public void Link()
{
first=(EditText) findViewById(R.id.editFirst);
last=(EditText) findViewById(R.id.editLast);
classc=(EditText) findViewById(R.id.editClass);
age=(EditText) findViewById(R.id.editAge);
add=(Button) findViewById(R.id.Add);
view=(Button) findViewById(R.id.ViewAll);
}
public void xmlToVar()
{
FirstName = first.getText().toString();
LastName = last.getText().toString();
Class = classc.getText().toString();
Age = Integer.parseInt(age.getText().toString());
}
}
sqLit.java
package com.example.database;
import org.w3c.dom.Text;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.text.Editable;
public class sqLit extends SQLiteOpenHelper
{
public static final String DB_NAME="student12.db";
public static final String TABLE_NAME="class1";
public static final String COL_1="ROLLNO";
public static final String COL_2="FirstName";
public static final String COL_3="LastName";
public static final String COL_4="Class";
public static final String COL_5="Age";
public sqLit(Context context) {
super(context, DB_NAME, null, 1);
// TODO Auto-generated constructor stub
}
#Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + TABLE_NAME + "(" +COL_1 + " INTEGER PRIMARY KEY AUTOINCREMENT,"+COL_2 + " TEXT,"+COL_3 + " TEXT,"+COL_4 + " TEXT,"+COL_5 + " INTEGER)");
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("Drop Table If Exist" + TABLE_NAME );
onCreate(db);
}
public Integer insertValue(String firstName, String lastName, String Class, Integer Age)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentV = new ContentValues();
contentV.put(COL_2, firstName);
contentV.put(COL_3, lastName);
contentV.put(COL_4, Class);
contentV.put(COL_5, Age);
long isInserted = db.insert(TABLE_NAME, null, contentV);
if (isInserted == -1){
return 0;
}
else
{
return 1;
}
}
public Cursor getData()
{
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("Select * From "+TABLE_NAME, null);
return res;
}
}
LogCat
06-11 22:02:40.728: D/dalvikvm(1576): Not late-enabling CheckJNI (already on)
06-11 22:02:40.737: E/Trace(1576): error opening trace file: No such file or directory (2)
06-11 22:02:40.817: D/gralloc_goldfish(1576): Emulator without GPU emulation detected.
06-11 22:05:14.779: D/dalvikvm(1576): GC_CONCURRENT freed 197K, 5% free 6176K/6471K, paused 15ms+0ms, total 19ms
06-11 22:08:27.242: E/Trace(2066): error opening trace file: No such file or directory (2)
06-11 22:08:27.322: D/gralloc_goldfish(2066): Emulator without GPU emulation detected.
06-11 22:08:31.472: D/dalvikvm(2066): GC_CONCURRENT freed 225K, 5% free 6148K/6471K, paused 17ms+1ms, total 19ms
06-11 22:10:36.644: D/dalvikvm(2290): GC_CONCURRENT freed 225K, 5% free 6148K/6471K, paused 16ms+0ms, total 19ms
06-11 22:10:52.355: D/AndroidRuntime(2290): Shutting down VM
06-11 22:10:52.355: W/dalvikvm(2290): threadid=1: thread exiting with uncaught exception (group=0xb3f1c288)
06-11 22:10:52.355: E/AndroidRuntime(2290): FATAL EXCEPTION: main
06-11 22:10:52.355: E/AndroidRuntime(2290): java.lang.NumberFormatException: Invalid int: ""
06-11 22:10:52.355: E/AndroidRuntime(2290): at java.lang.Integer.invalidInt(Integer.java:138)
06-11 22:10:52.355: E/AndroidRuntime(2290): at java.lang.Integer.parseInt(Integer.java:359)
06-11 22:10:52.355: E/AndroidRuntime(2290): at java.lang.Integer.parseInt(Integer.java:332)
06-11 22:10:52.355: E/AndroidRuntime(2290): at com.example.database.MainActivity.xmlToVar(MainActivity.java:115)
06-11 22:10:52.355: E/AndroidRuntime(2290): at com.example.database.MainActivity$1.onClick(MainActivity.java:46)
06-11 22:10:52.355: E/AndroidRuntime(2290): at android.view.View.performClick(View.java:4084)
06-11 22:10:52.355: E/AndroidRuntime(2290): at android.view.View$PerformClick.run(View.java:16966)
06-11 22:10:52.355: E/AndroidRuntime(2290): at android.os.Handler.handleCallback(Handler.java:615)
06-11 22:10:52.355: E/AndroidRuntime(2290): at android.os.Handler.dispatchMessage(Handler.java:92)
06-11 22:10:52.355: E/AndroidRuntime(2290): at android.os.Looper.loop(Looper.java:137)
06-11 22:10:52.355: E/AndroidRuntime(2290): at android.app.ActivityThread.main(ActivityThread.java:4745)
06-11 22:10:52.355: E/AndroidRuntime(2290): at java.lang.reflect.Method.invokeNative(Native Method)
06-11 22:10:52.355: E/AndroidRuntime(2290): at java.lang.reflect.Method.invoke(Method.java:511)
06-11 22:10:52.355: E/AndroidRuntime(2290): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
06-11 22:10:52.355: E/AndroidRuntime(2290): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
06-11 22:10:52.355: E/AndroidRuntime(2290): at dalvik.system.NativeStart.main(Native Method)
06-11 22:12:22.676: D/dalvikvm(2455): GC_CONCURRENT freed 201K, 5% free 6172K/6471K, paused 17ms+0ms, total 19ms
06-11 22:14:01.238: D/dalvikvm(2652): Not late-enabling CheckJNI (already on)
06-11 22:14:01.248: E/Trace(2652): error opening trace file: No such file or directory (2)
06-11 22:14:01.338: D/gralloc_goldfish(2652): Emulator without GPU emulation detected.
The Button isn’t working at all.
The below exception from xmlToVar method is the problem, you are calling this in addButtonClicked method
java.lang.NumberFormatException: Invalid int: ""
If the value in Age field is not entered then this error will happen if you make empty check before calling
Age = Integer.parseInt(age.getText().toString());
should solve the issue
Validate input before you use parseInt in xmlToVar():
String ageStr = age.getText().toString();
if (ageStr != "")
r.age = Integer.parseInt(ageStr);
You can also initialize Integer age, if there can be a default value.
You need to provide information about the following :
i) Did you try to debug ?
ii) If yes, does the cursor get any data ?
Now a different approach to the problem :
Create class of data [makes it easier to handle, i.e store and fetch from database]
example :
Class :
public class NoticeInformation {
private String NoticeType, NoticeHeader, NoticeLink;
private int Important, NoticeId, Read;
public NoticeInformation(int NoticeId,
String NoticeType,
String NoticeHeader,
String NoticeLink,
int Important,
int Read){
this.NoticeId = NoticeId;
this.NoticeType = NoticeType;
this.NoticeHeader = NoticeHeader;
this.NoticeLink = NoticeLink;
this.Important = Important;
this.Read = Read;
}
public int getNoticeId() {
return NoticeId;
}
public void setNoticeId(int noticeId) {
NoticeId = noticeId;
}
public String getNoticeType() {
return NoticeType;
}
public void setNoticeType(String noticeType) {
NoticeType = noticeType;
}
public String getNoticeHeader() {
return NoticeHeader;
}
public void setNoticeHeader(String noticeHeader) {
NoticeHeader = noticeHeader;
}
public String getNoticeLink() {
return NoticeLink;
}
public void setNoticeLink(String noticeLink) {
NoticeLink = noticeLink;
}
public int getImportant() {
return Important;
}
public void setImportant(int important) {
Important = important;
}
public int getRead() {
return Read;
}
public void setRead(int read) {
Read = read;
}
}
Database Read :
public List<NoticeInformation> getScheduleNotice(){
SQLiteDatabase db = this.getReadableDatabase();
List<NoticeInformation> res = new ArrayList<>();
String Query = "SELECT * FROM " + TABLE_NAME1 + " WHERE NoticeType = 'Schedule';";
Cursor cursor = db.rawQuery(Query, null);
if (cursor.moveToFirst()){
cursor.moveToFirst();
do
{
NoticeInformation obj = new NoticeInformation(cursor.getInt(0), cursor.getString(1),
cursor.getString(2), cursor.getString(3), cursor.getInt(5),
cursor.getInt(4));
res.add(obj);
}while(cursor.moveToNext());
return res;
}
return null;
}
Instead of handling cursor in the application end, just have the data in a list. It is easier to handle [in my humble opinion].
Try this approach and let me know the result.
Well to be more specific I have made a create account fragment and a login fragment. When switching to landscape in the create account fragment it actually goes back to the login fragment. And then if you try to switch back into portrait then the app crashes. I've looked at similar questions but I couldnt make anything out from them. I really appreciate the help guys!
CreateAccountFragment
package com.keyconsultant.parse.logintutorial;
/**
* Create an Account. Username is the primary method of login. Email is used for forgotten password recovery.
*
* #author Trey Robinson
*
*/
public class CreateAccountFragment extends BaseFragment implements OnClickListener {
protected static final String EXTRA_EMAIL = "com.keyconsultant.parse.logintutorial.fragment.extra.EMAIL";
protected static final String EXTRA_USERNAME = "com.keyconsultant.parse.logintutorial.fragment.extra.USERNAME";
protected static final String EXTRA_PASSWORD = "com.keyconsultant.parse.logintutorial.fragment.extra.PASSWORD";
protected static final String EXTRA_CONFIRM = "com.keyconsultant.parse.logintutorial.fragment.extra.CONFIRMPASSWORD";
private EditText mUserNameEditText;
private EditText mEmailEditText;
private EditText mPasswordEditText;
private EditText mConfirmPasswordEditText;
private Button mCreateAccountButton;
private String mEmail;
private String mUsername;
private String mPassword;
private String mConfirmPassword;
/**
* Factory method for creating fragment instances.
* #return
*/
public static CreateAccountFragment newInstance(){
return new CreateAccountFragment();
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_create_account, container, false);
mUserNameEditText = (EditText)view.findViewById(R.id.etUsername);
mEmailEditText = (EditText)view.findViewById(R.id.etEmail);
mPasswordEditText = (EditText)view.findViewById(R.id.etPassword);
mConfirmPasswordEditText = (EditText)view.findViewById(R.id.etPasswordConfirm);
mCreateAccountButton = (Button)view.findViewById(R.id.btnCreateAccount);
mCreateAccountButton.setOnClickListener(this);
return view;
}
#Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(savedInstanceState != null){
mEmailEditText.setText(savedInstanceState.getString(EXTRA_EMAIL));
mUserNameEditText.setText(savedInstanceState.getString(EXTRA_USERNAME));
mPasswordEditText.setText(savedInstanceState.getString(EXTRA_PASSWORD));
mConfirmPasswordEditText.setText(savedInstanceState.getString(EXTRA_CONFIRM));
}
}
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(EXTRA_EMAIL, mEmailEditText.getText().toString());
outState.putString(EXTRA_USERNAME, mUserNameEditText.getText().toString());
outState.putString(EXTRA_PASSWORD, mPasswordEditText.getText().toString());
outState.putString(EXTRA_CONFIRM, mConfirmPasswordEditText.getText().toString());
}
#Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnCreateAccount:
createAccount();
break;
default:
break;
}
}
/**
* Some front end validation is done that is not monitored by the service.
* If the form is complete then the information is passed to the service.
*/
private void createAccount(){
clearErrors();
boolean cancel = false;
View focusView = null;
// Store values at the time of the login attempt.
mEmail = mEmailEditText.getText().toString();
mUsername = mUserNameEditText.getText().toString();
mPassword = mPasswordEditText.getText().toString();
mConfirmPassword = mConfirmPasswordEditText.getText().toString();
// Check for a valid confirm password.
if (TextUtils.isEmpty(mConfirmPassword)) {
mConfirmPasswordEditText.setError(getString(R.string.error_field_required));
focusView = mConfirmPasswordEditText;
cancel = true;
} else if (mPassword != null && !mConfirmPassword.equals(mPassword)) {
mPasswordEditText.setError(getString(R.string.error_invalid_confirm_password));
focusView = mPasswordEditText;
cancel = true;
}
// Check for a valid password.
if (TextUtils.isEmpty(mPassword)) {
mPasswordEditText.setError(getString(R.string.error_field_required));
focusView = mPasswordEditText;
cancel = true;
} else if (mPassword.length() < 4) {
mPasswordEditText.setError(getString(R.string.error_invalid_password));
focusView = mPasswordEditText;
cancel = true;
}
// Check for a valid email address.
if (TextUtils.isEmpty(mEmail)) {
mEmailEditText.setError(getString(R.string.error_field_required));
focusView = mEmailEditText;
cancel = true;
} else if (!mEmail.contains("#")) {
mEmailEditText.setError(getString(R.string.error_invalid_email));
focusView = mEmailEditText;
cancel = true;
}
if (cancel) {
// There was an error; don't attempt login and focus the first
// form field with an error.
focusView.requestFocus();
} else {
// Show a progress spinner, and kick off a background task to
// perform the user login attempt.
UserManager.getInstance().signUp(mUsername.toLowerCase(Locale.getDefault()), mEmail, mPassword);
}
}
/**
* Remove error messages from all fields.
*/
private void clearErrors(){ mEmailEditText.setError(null);
mUserNameEditText.setError(null);
mPasswordEditText.setError(null);
mConfirmPasswordEditText.setError(null);
}
#Subscribe
public void onSignInError(AuthenticateUserErrorEvent event){
clearErrors();
switch (event.getErrorCode()) {
case ParseException.INVALID_EMAIL_ADDRESS:
mEmailEditText.setError(getString(R.string.error_invalid_email));
mEmailEditText.requestFocus();
break;
case ParseException.EMAIL_TAKEN:
mEmailEditText.setError(getString(R.string.error_duplicate_email));
mEmailEditText.requestFocus();
break;
case ParseException.USERNAME_TAKEN:
mUserNameEditText.setError(getString(R.string.error_duplicate_username));
mUserNameEditText.requestFocus();
break;
default:
UnknownErrorDialogFactory.createUnknownErrorDialog(this.getActivity()).show();
break;
}
}
}
LoginFragment
package com.keyconsultant.parse.logintutorial;
/**
* Fragment for logging in. Includes button for loading the Create account view.
*
* #author Trey Robinson
*
*/
public class LoginFragment extends BaseFragment {
public static final String EXTRA_USERNAME = "com.keyconsultant.parse.logintutorial.activity.extra.USERNAME";
public static final String EXTRA_PASSWORD = "com.keyconsultant.parse.logintutorial.activity.extra.PASSWORD";
// UI references.
private EditText mUserNameEditText;
private EditText mPasswordEditText;
/**
* Factory method for creating new fragments
*
* #return
*/
public static LoginFragment newInstance() {
return new LoginFragment();
}
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_login, container, false);
mUserNameEditText = (EditText) view.findViewById(R.id.username);
mPasswordEditText = (EditText) view.findViewById(R.id.password);
mPasswordEditText
.setOnEditorActionListener(new TextView.OnEditorActionListener() {
#Override
public boolean onEditorAction(TextView textView, int id,
KeyEvent keyEvent) {
if (id == EditorInfo.IME_NULL) {
attemptLogin();
return true;
}
return false;
}
});
view.findViewById(R.id.sign_in_button).setOnClickListener(
new View.OnClickListener() {
#Override
public void onClick(View view) {
attemptLogin();
}
});
view.findViewById(R.id.register_button).setOnClickListener(
new View.OnClickListener() {
#Override
public void onClick(View view) {
createAccount();
}
});
view.findViewById(R.id.forgot_button).setOnClickListener(
new View.OnClickListener() {
#Override
public void onClick(View view) {
forgotPassword();
}
});
return view;
}
/**
* Open the forgotPassword dialog
*/
private void forgotPassword() {
FragmentManager fm = getActivity().getSupportFragmentManager();
ForgotPasswordDialogFragment forgotPasswordDialog = new ForgotPasswordDialogFragment();
forgotPasswordDialog.show(fm, null);
}
#Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState != null) {
mUserNameEditText.setText(savedInstanceState
.getString(EXTRA_USERNAME));
mPasswordEditText.setText(savedInstanceState
.getString(EXTRA_PASSWORD));
}
}
#Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(EXTRA_USERNAME, mUserNameEditText.getText()
.toString());
outState.putString(EXTRA_PASSWORD, mPasswordEditText.getText()
.toString());
}
/**
* Attempts to sign in or register the account specified by the login form.
* If there are form errors (invalid email, missing fields, etc.), the
* errors are presented and no actual login attempt is made.
*/
public void attemptLogin() {
clearErrors();
// Store values at the time of the login attempt.
String username = mUserNameEditText.getText().toString();
String password = mPasswordEditText.getText().toString();
boolean cancel = false;
View focusView = null;
// Check for a valid password.
if (TextUtils.isEmpty(password)) {
mPasswordEditText
.setError(getString(R.string.error_field_required));
focusView = mPasswordEditText;
cancel = true;
} else if (password.length() < 4) {
mPasswordEditText
.setError(getString(R.string.error_invalid_password));
focusView = mPasswordEditText;
cancel = true;
}
// Check for a valid email address.
if (TextUtils.isEmpty(username)) {
mUserNameEditText
.setError(getString(R.string.error_field_required));
focusView = mUserNameEditText;
cancel = true;
}
if (cancel) {
// There was an error; don't attempt login and focus the first
// form field with an error.
focusView.requestFocus();
} else {
// perform the user login attempt.
UserManager.getInstance().authenticate(
username.toLowerCase(Locale.getDefault()), password);
}
}
/**
* Load the create account view.
*/
private void createAccount() {
FragmentManager fragmentManager = getActivity()
.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.replace(
((ViewGroup) getView().getParent()).getId(),
CreateAccountFragment.newInstance());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
/**
* Remove all edit text errors
*/
private void clearErrors() {
mUserNameEditText.setError(null);
mPasswordEditText.setError(null);
}
#Subscribe
public void onSignInError(AuthenticateUserErrorEvent event) {
clearErrors();
switch (event.getErrorCode()) {
case ParseException.OBJECT_NOT_FOUND:
mPasswordEditText
.setError(getString(R.string.error_incorrect_password));
mPasswordEditText.requestFocus();
break;
default:
UnknownErrorDialogFactory.createUnknownErrorDialog(
this.getActivity()).show();
break;
}
}
}
Just in case you need it here is my LoginActivity
package com.keyconsultant.parse.logintutorial;
/**
* Activity which displays a login screen to the user, offering registration as
* well. Based loosley on the default Login template.
*
* #author Trey Robinson
*/
public class LoginActivity extends BaseActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Parse.initialize(this, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction
.replace(R.id.main_view, LoginFragment.newInstance());
fragmentTransaction.commit();
parseCache();
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.activity_login, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.menu_forgot_password:
forgotPassword();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/**
* Open the forgotPassword dialog
*/
private void forgotPassword() {
FragmentManager fm = getSupportFragmentManager();
ForgotPasswordDialogFragment forgotPasswordDialog = new ForgotPasswordDialogFragment();
forgotPasswordDialog.show(fm, null);
}
#Subscribe
public void onSignInStart(AuthenticateUserStartEvent event) {
showProgress(true, getString(R.string.login_progress_signing_in));
}
#Subscribe
public void onSignInSuccess(AuthenticateUserSuccessEvent event) {
showProgress(false, getString(R.string.login_progress_signing_in));
Intent loginSuccess = new Intent(this, MainActivity.class);
startActivity(loginSuccess);
finish();
}
#Subscribe
public void onSignInError(AuthenticateUserErrorEvent event) {
showProgress(false, getString(R.string.login_progress_signing_in));
}
#Subscribe
public void onForgotPasswordStart(UserForgotPasswordStartEvent event) {
showProgress(true, getString(R.string.login_progress_signing_in));
}
#Subscribe
public void onForgotPasswordSuccess(UserForgotPasswordSuccessEvent event) {
showProgress(false, getString(R.string.login_progress_signing_in));
Toast toast = Toast.makeText(this,
"A password reset email has been sent.", Toast.LENGTH_LONG);
toast.show();
}
#Subscribe
public void onForgotPasswordError(UserForgotPasswordErrorEvent event) {
showProgress(false, getString(R.string.login_progress_signing_in));
Toast toast = Toast.makeText(this,
"An error has occured. Please try again.", Toast.LENGTH_LONG);
toast.show();
}
private void parseCache() {
Intent intent;
if (ParseUser.getCurrentUser() != null) {
intent = new Intent(this, MainActivity.class);
startActivity(intent);
this.finish();
}
}
}
Here is the logcat
01-10 16:09:05.796: I/Process(1923): Sending signal. PID: 1923 SIG: 9
01-10 17:00:57.513: I/Choreographer(1975): Skipped 111 frames! The application may be doing too much work on its main thread.
01-10 17:00:57.513: D/gralloc_goldfish(1975): Emulator without GPU emulation detected.
01-10 17:00:58.363: I/Choreographer(1975): Skipped 36 frames! The application may be doing too much work on its main thread.
01-10 17:00:58.833: I/Choreographer(1975): Skipped 37 frames! The application may be doing too much work on its main thread.
01-10 17:00:59.163: I/Choreographer(1975): Skipped 32 frames! The application may be doing too much work on its main thread.
01-10 17:01:11.253: D/dalvikvm(1975): GC_FOR_ALLOC freed 74K, 5% free 5533K/5820K, paused 2ms, total 3ms
01-10 17:01:11.253: I/dalvikvm-heap(1975): Grow heap (frag case) to 7.992MB for 2500620-byte allocation
01-10 17:01:11.263: D/dalvikvm(1975): GC_FOR_ALLOC freed 2K, 4% free 7972K/8264K, paused 2ms, total 3ms
01-10 17:01:11.273: D/dalvikvm(1975): GC_FOR_ALLOC freed <1K, 4% free 7972K/8264K, paused 3ms, total 4ms
01-10 17:01:11.273: I/dalvikvm-heap(1975): Grow heap (frag case) to 10.696MB for 2838540-byte allocation
01-10 17:01:11.283: D/dalvikvm(1975): GC_FOR_ALLOC freed 0K, 3% free 10744K/11040K, paused 4ms, total 4ms
01-10 17:01:15.953: D/dalvikvm(1975): GC_FOR_ALLOC freed 5268K, 45% free 6880K/12360K, paused 0ms, total 3ms
01-10 17:01:15.953: I/dalvikvm-heap(1975): Grow heap (frag case) to 8.489MB for 1642512-byte allocation
01-10 17:01:15.973: D/dalvikvm(1975): GC_FOR_ALLOC freed <1K, 32% free 8483K/12360K, paused 13ms, total 13ms
01-10 17:01:16.053: I/Choreographer(1975): Skipped 42 frames! The application may be doing too much work on its main thread.
01-10 17:01:17.473: I/Choreographer(1975): Skipped 58 frames! The application may be doing too much work on its main thread.
01-10 17:01:18.043: I/Choreographer(1975): Skipped 57 frames! The application may be doing too much work on its main thread.
01-10 17:01:23.363: D/AndroidRuntime(1975): Shutting down VM
01-10 17:01:23.363: W/dalvikvm(1975): threadid=1: thread exiting with uncaught exception (group=0xb0f2e648)
01-10 17:01:23.363: E/AndroidRuntime(1975): FATAL EXCEPTION: main
01-10 17:01:23.363: E/AndroidRuntime(1975): java.lang.NullPointerException
01-10 17:01:23.363: E/AndroidRuntime(1975): at com.keyconsultant.parse.logintutorial.LoginFragment.onSaveInstanceState(LoginFragment.java:119)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.support.v4.app.Fragment.performSaveInstanceState(Fragment.java:1607)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1587)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1655)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:527)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.app.Activity.performSaveInstanceState(Activity.java:1147)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1223)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3714)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.app.ActivityThread.access$700(ActivityThread.java:141)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1262)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.os.Handler.dispatchMessage(Handler.java:99)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.os.Looper.loop(Looper.java:137)
01-10 17:01:23.363: E/AndroidRuntime(1975): at android.app.ActivityThread.main(ActivityThread.java:5103)
01-10 17:01:23.363: E/AndroidRuntime(1975): at java.lang.reflect.Method.invokeNative(Native Method)
01-10 17:01:23.363: E/AndroidRuntime(1975): at java.lang.reflect.Method.invoke(Method.java:525)
01-10 17:01:23.363: E/AndroidRuntime(1975): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-10 17:01:23.363: E/AndroidRuntime(1975): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-10 17:01:23.363: E/AndroidRuntime(1975): at dalvik.system.NativeStart.main(Native Method)
Your logcat shows you have problems in LoginFragment.onSaveInstanceState()
First, make super.onSaveInstanceState() the last line instead of the first line as it is now.
Then make sure you don't have mUserName and mPassword and their texts as nulls
Initialize mUserName and password texts to "" somewhere and the error should be gone, I think.
I am having trouble adding another column it just bugs after 5 columns..it says in logs that i have only 5 columns...
check this
Logcat
11-05 03:31:45.455: I/dalvikvm(3845): Turning on JNI app bug workarounds for target SDK version 8...
11-05 03:31:46.395: D/dalvikvm(3845): GC_FOR_ALLOC freed 78K, 8% free 2671K/2884K, paused 80ms, total 82ms
11-05 03:31:46.405: I/dalvikvm-heap(3845): Grow heap (frag case) to 3.341MB for 635812-byte allocation
11-05 03:31:46.475: D/dalvikvm(3845): GC_FOR_ALLOC freed <1K, 7% free 3291K/3508K, paused 67ms, total 67ms
11-05 03:31:46.595: D/Insert:(3845): Inserting ..
11-05 03:31:46.595: D/Reading:(3845): Reading all naps..
11-05 03:31:47.395: D/(3845): HostConnection::get() New Host Connection established 0x2a20c298, tid 3845
11-05 03:32:01.885: D/dalvikvm(3845): GC_FOR_ALLOC freed 220K, 9% free 3584K/3936K, paused 78ms, total 91ms
11-05 03:32:30.646: D/dalvikvm(3895): GC_FOR_ALLOC freed 42K, 7% free 2671K/2848K, paused 90ms, total 93ms
11-05 03:32:30.667: I/dalvikvm-heap(3895): Grow heap (frag case) to 3.341MB for 635812-byte allocation
11-05 03:32:30.796: D/dalvikvm(3895): GC_FOR_ALLOC freed <1K, 6% free 3291K/3472K, paused 100ms, total 100ms
11-05 03:32:30.876: D/Insert:(3895): Inserting ..
11-05 03:32:30.876: D/Reading:(3895): Reading all naps..
11-05 03:32:30.976: E/CursorWindow(3895): Failed to read row 0, column 5 from a CursorWindow which has 11 rows, 5 columns.
11-05 03:32:30.986: D/AndroidRuntime(3895): Shutting down VM
11-05 03:32:30.986: W/dalvikvm(3895): threadid=1: thread exiting with uncaught exception (group=0x41465700)
11-05 03:32:31.016: E/AndroidRuntime(3895): FATAL EXCEPTION: main
11-05 03:32:31.016: E/AndroidRuntime(3895): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhive.androidsqlite/com.androidhive.androidsqlite.NapDbase}: java.lang.IllegalStateException: Couldn't read row 0, col 5 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.os.Handler.dispatchMessage(Handler.java:99)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.os.Looper.loop(Looper.java:137)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.app.ActivityThread.main(ActivityThread.java:5103)
11-05 03:32:31.016: E/AndroidRuntime(3895): at java.lang.reflect.Method.invokeNative(Native Method)
11-05 03:32:31.016: E/AndroidRuntime(3895): at java.lang.reflect.Method.invoke(Method.java:525)
11-05 03:32:31.016: E/AndroidRuntime(3895): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-05 03:32:31.016: E/AndroidRuntime(3895): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-05 03:32:31.016: E/AndroidRuntime(3895): at dalvik.system.NativeStart.main(Native Method)
11-05 03:32:31.016: E/AndroidRuntime(3895): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col 5 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.database.CursorWindow.nativeGetString(Native Method)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.database.CursorWindow.getString(CursorWindow.java:434)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
11-05 03:32:31.016: E/AndroidRuntime(3895): at com.androidhive.androidsqlite.DatabaseHandler.getAllNapChecks(DatabaseHandler.java:110)
11-05 03:32:31.016: E/AndroidRuntime(3895): at com.androidhive.androidsqlite.NapDbase.onCreate(NapDbase.java:75)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.app.Activity.performCreate(Activity.java:5133)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
11-05 03:32:31.016: E/AndroidRuntime(3895): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
11-05 03:32:31.016: E/AndroidRuntime(3895): ... 11 more
My Database.
package com.androidhive.androidsqlite;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHandler extends SQLiteOpenHelper {
// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "NapsManager";
// NapChecks table name
private static final String TABLE_NapS = "Naps";
// NapChecks Table Columns names
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_MALL = "mall";
private static final String KEY_LATIT = "latit";
private static final String KEY_LONGIT = "longit";
private static final String KEY_INTER = "inte";
private static final String KEY_CATE = "cate";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Creating Tables
#Override
public void onCreate(SQLiteDatabase db) {
String CREATE_NapS_TABLE = "CREATE TABLE " + TABLE_NapS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_MALL + " TEXT," + KEY_LATIT + " TEXT,"
+ KEY_LONGIT + " TEXT," + KEY_INTER + " TEXT,"
+ KEY_CATE + " TEXT" +")";
db.execSQL(CREATE_NapS_TABLE);
}
// Upgrading database
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NapS);
// Create tables again
onCreate(db);
}
/**
* All CRUD(Create, Read, Update, Delete) Operations
*/
// Adding new nap
void addNapCheck(NapCheck nap) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, nap.getName()); // NapCheck Name
values.put(KEY_MALL, nap.getMall()); // NapCheck Phone
values.put(KEY_LATIT, nap.getLatit()); // NapCheck Name
values.put(KEY_LONGIT, nap.getLongit());
values.put(KEY_INTER, nap.getInte());
// Inserting Row
db.insert(TABLE_NapS, null, values);
db.close(); // Closing database connection
}
// Getting single nap
NapCheck getNapCheck(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NapS, new String[] { KEY_ID,
KEY_NAME, KEY_MALL, KEY_LATIT, KEY_LONGIT, KEY_INTER, }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
NapCheck nap = new NapCheck(Integer.parseInt(cursor.getString(0)),
cursor.getString(1), cursor.getString(2),cursor.getString(3), cursor.getString(4), cursor.getString(5));
// return nap
return nap;
}
// Getting All NapChecks
public List<NapCheck> getAllNapChecks() {
List<NapCheck> NapList = new ArrayList<NapCheck>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_NapS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
NapCheck nap = new NapCheck();
nap.setID(Integer.parseInt(cursor.getString(0)));
nap.setName(cursor.getString(1));
nap.setMall(cursor.getString(2));
nap.setLatit(cursor.getString(3));
nap.setLongit(cursor.getString(4));
nap.setLongit(cursor.getString(5));
// Adding nap to list
NapList.add(nap);
} while (cursor.moveToNext());
}
// return nap list
return NapList;
}
// Updating single nap
public int updateNapCheck(NapCheck nap) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, nap.getName());
values.put(KEY_MALL, nap.getMall());
values.put(KEY_LATIT, nap.getLatit());
values.put(KEY_LONGIT, nap.getLongit());
values.put(KEY_INTER, nap.getLongit());
// updating row
return db.update(TABLE_NapS, values, KEY_ID + " = ?",
new String[] { String.valueOf(nap.getID()) });
}
// Deleting single nap
public void deleteNapCheck(NapCheck nap) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_NapS, KEY_ID + " = ?",
new String[] { String.valueOf(nap.getID()) });
db.close();
}
// Getting Naps Count
public int getNapChecksCount() {
String countQuery = "SELECT * FROM " + TABLE_NapS;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// return count
return cursor.getCount();
}
}
And this is my Getters and Setters
package com.androidhive.androidsqlite;
public class NapCheck {
//private variables
int _id;
String _name;
String _mall;
String latit;
String longit;
String inte;
String cate;
// Empty constructor
public NapCheck(){
}
// constructor
public NapCheck(int id, String name, String _mall,String latit, String longit, String inte){
this._id = id;
this._name = name;
this._mall = _mall;
this.latit = latit;
this.longit = longit;
this.inte = inte;
}
// constructor
public NapCheck(String name, String _mall,String latit, String longit, String inte){
this._name = name;
this._mall = _mall;
this.latit = latit;
this.longit = longit;
this.inte = inte;
}
// 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 phone number
public String getMall(){
return this._mall;
}
// setting phone number
public void setMall(String phone_number){
this._mall = phone_number;
}
public String getLatit(){
return this.latit;
}
// setting phone number
public void setLatit(String latit){
this.latit = latit;
}
public String getLongit(){
return this.longit;
}
// setting phone number
public void setLongit(String longit){
this.longit = longit;
}
public String getInte(){
return this.inte;
}
public void setInte(String inte){
this.inte = inte;
}
public String getCate(){
return this.cate;
}
// setting phone number
public void setCate(String cate){
this.cate = cate;
}
}
I don't know what is wrong everytime i set a column in public List getAllNapChecks() it gets bugged and says i only have five columns i don't know i've been doing this for hours..Thanks in advance..Just tell if you need more
public List<NapCheck> getAllNapChecks() {
List<NapCheck> NapList = new ArrayList<NapCheck>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_NapS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
NapCheck nap = new NapCheck();
nap.setID(Integer.parseInt(cursor.getString(0)));
nap.setName(cursor.getString(1));
nap.setMall(cursor.getString(2));
nap.setLatit(cursor.getString(3));
nap.setLongit(cursor.getString(4));
this line is where i get problem most of the time..
nap.setLongit(cursor.getString(5));
// Adding nap to list
NapList.add(nap);
} while (cursor.moveToNext());
}
// return nap list
return NapList;
}
Probably this isn't your first DB-schema, that you created.
You have to increase your DB-version, if you edit your DB-schema. Otherwise neither onUpdate() will not be called.
Try:
private static final int DATABASE_VERSION = 2;
I think the unwanted space and comma after the KEY_INTER(last field) is the problem change that.
Cursor cursor = db.query(TABLE_NapS, new String[] { KEY_ID,
KEY_NAME, KEY_MALL, KEY_LATIT, KEY_LONGIT, KEY_INTER}, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
The onCreate (SQLiteDatabase db) method in DatabaseHandler is called only once when the database is accessed for the first time. This means that any changes to the schema will not result in this method being called.
To apply the change in schema, you can take either of two actions:
Uninstall and then install the application in the device/emulator.
Increase the value of DATABASE_VERSION in order to trigger a call to onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion). As per your implementation, this will result in the existing table being dropped and recreated.
I am getting error in my code which is not understandable.. please help me find out what issue is it.
i have database class and main activity.. it shows in log but when it comes to appear at my emulator's screen it gives me error.
my database class:
package com.example.nearby_places;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class Database extends SQLiteOpenHelper {
//database name & version number
private static final String db_name = "nearby_places";
private static final int db_version = 1;
//tables
private static final String table_placetypes = "placetypes";
private static final String table_places = "table_places";
//column names
private static final String type_id = "type_id";
private static final String type_name = "type_name";
private static final String place_id = "place_id";
private static final String place_name = "place_name";
private static final String place_address = "place_address";
private static final String place_contact = "place_contact";
public Database(Context context) {
super(context, db_name, null, db_version);
// TODO Auto-generated constructor stub
}
// create table queries
String create_table_placetypes = "CREATE TABLE IF NOT EXISTS " + table_placetypes + "("
+ type_id + " INTEGER PRIMARY KEY NOT NULL," + type_name + " TEXT" + ")";
String create_table_places = "CREATE TABLE IF NOT EXISTS table_places (place_id INTEGER PRIMARY KEY NOT NULL, place_name TEXT, place_address TEXT, place_contact TEXT, type_id INTEGER, FOREIGN KEY (type_id) REFERENCES table_placetypes(type_id))";
#Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(create_table_placetypes);
Log.d("creating", "placetypes created");
db.execSQL(create_table_places);
Log.d("creating", "places created");
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS " + table_placetypes);
db.execSQL("DROP TABLE IF EXISTS " + table_places);
onCreate(db);
}
// add placetypes
void addplacetypes (placetypes pt) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(type_name, pt.getTypename());
db.insert(table_placetypes, null, values);
db.close();
}
// Getting single placetypes
placetypes getPlacetypes(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(table_placetypes, new String[] {type_id,
type_name }, type_id + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
placetypes pt = new placetypes(Integer.parseInt(cursor.getString(0)),
cursor.getString(1));
// return contact
return pt;
}
// Getting All placetypes
public List<placetypes> getAllPlacetypes() {
List<placetypes> placetypesList = new ArrayList<placetypes>();
// Select All Query
String selectQuery = "SELECT * FROM " + table_placetypes;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
placetypes pt = new placetypes();
pt.setTypeid(Integer.parseInt(cursor.getString(0)));
pt.setTypename(cursor.getString(1));
//String name = cursor.getString(1);
//MainActivity.ArrayofName.add(name);
// Adding contact to list
placetypesList.add(pt);
} while (cursor.moveToNext());
}
// return placetype list
return placetypesList;
}
// Getting placetypes Count
public int getPlacetypesCount() {
String countQuery = "SELECT * FROM " + table_placetypes;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
// return count
return cursor.getCount();
}
public void addplaces(places p) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(place_name, p.getPlace_name());
values.put(place_address, p.getPlace_address());
values.put(place_contact, p.getPlace_contact());
values.put(type_id, p.getT_id());
Log.d("Type ID", String.valueOf(p.getT_id()));
db.insert(table_places, null, values);
db.close();
}
places getPlaces(int pid) {
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.query(table_places, new String[] {place_id, place_name, place_address, place_contact,type_id}, place_id + "=?", new String[] { String.valueOf(pid) } , null, null, null, null);
if(cursor != null)
cursor.moveToFirst();
places p = new places(Integer.parseInt(cursor.getString(0)),
Integer.parseInt(cursor.getString(1)),
cursor.getString(2),
cursor.getString(3),
cursor.getString(4)
);
cursor.close();
return p;
}
public List<places> getAllPlaces(String typeName) {
List<places> placeList = new ArrayList<places>();
//String selectQuery = "SELECT * FROM table_places INNER JOIN placetypes ON placetypes.type_id=table_places.type_id ";
//String selectQuery = "SELECT * FROM table_places WHERE table_places.type_id="+Integer.toString(typeid);
String selectQuery ="SELECT * FROM table_places WHERE placetypes.place_name="+typeName+" INNER JOIN placetypes ON placetypes.type_id=table_places.type_id";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if(cursor.moveToFirst() )
{
do{
places p = new places();
/*p.setT_id(cursor.getColumnIndex(type_id));
p.setPlace_id(cursor.getColumnIndex(place_id));
p.setPlace_name(cursor.getColumnIndex(place_name));
*/
p.setT_id(cursor.getInt(0));
p.setPlace_id(cursor.getInt(1));
p.setPlace_name(cursor.getString(2));
p.setPlace_address(cursor.getString(3));
p.setPlace_contact(cursor.getString(4));
/*String t_id = cursor.getString(4);
String p_name = cursor.getString(2);
String p_address = cursor.getString(3);
String p_contact = cursor.getString(1);*/
placeList.add(p);
}while(cursor.moveToNext());
}
cursor.close();
return placeList;
}
public int getPlaceCount () {
String selectQuery = "SELECT * FROM " +table_places;
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(create_table_places, null);
cursor.close();
return cursor.getCount();
}
}
MainActivity
package com.example.nearby_places;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class MainActivity extends Activity {
private ListView listView;
public static ArrayList<String> ArrayofName = new ArrayList<String>();
public static final String PLACETYPE = "com.example";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Database db = new Database(this);
if(db.getAllPlacetypes().isEmpty())
{
/**
* CRUD Operations
* */
// Inserting Places
Log.d("Insert: ", "Inserting ..");
db.addplacetypes(new placetypes("RESTURAUNTS"));
db.addplacetypes(new placetypes("MALLS"));
db.addplacetypes(new placetypes("GAS STATIONS"));
db.addplacetypes(new placetypes("HOTELS"));
db.addplacetypes(new placetypes("MOTELS"));
}
// Reading all Places
Log.d("Reading: ", "Reading all placetypes..");
if(ArrayofName.isEmpty())
{
List<placetypes> placetypes = db.getAllPlacetypes();
for (placetypes pt : placetypes)
{
String log = "Id: "+pt.getTypeid()+" ,Name: " + pt.getTypename();
// Writing Places to log
Log.d("Name: ", log);
System.out.println(log);
ArrayofName.add(pt.getTypename());
}
}
listView = (ListView) findViewById(R.id.listView1);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, ArrayofName);
int pos = listView.getAdapter().getCount() -1;
listView.getAdapter().getItemId(pos);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
String type = ((TextView) v).getText().toString();
Toast.makeText(getApplicationContext(), type, Toast.LENGTH_SHORT).show();
Intent i = new Intent(getApplicationContext(),MainActivity2.class);
i.putExtra(PLACETYPE, type);
startActivity(i);
/*Cursor cursor = (Cursor) parent.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), "id: " +id+ "position: " +position+ "row id: " +(cursor.getColumnIndex("" +
"")), Toast.LENGTH_LONG).show();
*/
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
startActivity(intent);
}
}
);
}
}
Logcat
10-11 17:21:51.871: D/Reading:(4932): Reading all placetypes..
10-11 17:21:51.871: D/Name:(4932): Id: 1 ,Name: RESTURAUNTS
10-11 17:21:51.875: I/System.out(4932): Id: 1 ,Name: RESTURAUNTS
10-11 17:21:51.875: D/Name:(4932): Id: 2 ,Name: MALLS
10-11 17:21:51.875: I/System.out(4932): Id: 2 ,Name: MALLS
10-11 17:21:51.875: D/Name:(4932): Id: 3 ,Name: GAS STATIONS
10-11 17:21:51.875: I/System.out(4932): Id: 3 ,Name: GAS STATIONS
10-11 17:21:51.875: D/Name:(4932): Id: 4 ,Name: HOTELS
10-11 17:21:51.875: I/System.out(4932): Id: 4 ,Name: HOTELS
10-11 17:21:51.875: D/Name:(4932): Id: 5 ,Name: MOTELS
10-11 17:21:51.875: I/System.out(4932): Id: 5 ,Name: MOTELS
10-11 17:21:51.887: D/AndroidRuntime(4932): Shutting down VM
10-11 17:21:51.887: W/dalvikvm(4932): threadid=1: thread exiting with uncaught exception (group=0x41c77300)
10-11 17:21:51.894: E/AndroidRuntime(4932): FATAL EXCEPTION: main
10-11 17:21:51.894: E/AndroidRuntime(4932): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.nearby_places/com.example.nearby_places.MainActivity}: java.lang.NullPointerException
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.app.ActivityThread.access$600(ActivityThread.java:130)
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.os.Handler.dispatchMessage(Handler.java:99)
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.os.Looper.loop(Looper.java:137)
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.app.ActivityThread.main(ActivityThread.java:4745)
10-11 17:21:51.894: E/AndroidRuntime(4932): at java.lang.reflect.Method.invokeNative(Native Method)
10-11 17:21:51.894: E/AndroidRuntime(4932): at java.lang.reflect.Method.invoke(Method.java:511)
10-11 17:21:51.894: E/AndroidRuntime(4932): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-11 17:21:51.894: E/AndroidRuntime(4932): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-11 17:21:51.894: E/AndroidRuntime(4932): at dalvik.system.NativeStart.main(Native Method)
10-11 17:21:51.894: E/AndroidRuntime(4932): Caused by: java.lang.NullPointerException
10-11 17:21:51.894: E/AndroidRuntime(4932): at com.example.nearby_places.MainActivity.onCreate(MainActivity.java:62)
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.app.Activity.performCreate(Activity.java:5008)
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
10-11 17:21:51.894: E/AndroidRuntime(4932): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
10-11 17:21:51.894: E/AndroidRuntime(4932): ... 11 more
10-11 17:21:53.695: I/Process(4932): Sending signal. PID: 4932 SIG: 9
Your call to getAdapter is returning null because you're calling it before setAdapter, try this instead :
listView.setAdapter(adapter);
int pos = listView.getAdapter().getCount() -1;
listView.getAdapter().getItemId(pos);
If you have a NULLPOINTER Exception please have a deep look at your LogCat. Especial at the Line where it says Caused by.
Learn how to read and use your LogCat, and try to find the Line where it mentions your class/package name and analyse this line.
Caused by: java.lang.NullPointerException
10-11 17:21:51.894: E/AndroidRuntime(4932): at com.example.nearby_places.MainActivity.onCreate(MainActivity.java:62)
The problem is in
List<placetypes> placetypes = db.getAllPlacetypes();
The query you are using is wrong. It should be
`SELECT * FROM table_places INNER JOIN placetypes ON placetypes.type_id=table_places.type_id WHERE placetypes.place_name="+typeName+`"