My app closes when i insert this sample records for testing, i tried it in many ways. from activity class im sending string values to insert to the database.
My MainInvoiceActivity Class
public class MainInvoiceActivity extends Activity {
private DBHelper mydb ;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_invoice);
if ( mydb.insertsample( "one" , "two" , "3" )){ // LINE NO 67
Toast.makeText(getApplicationContext(), "Insert Success!", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(getApplicationContext(), "not done", Toast.LENGTH_SHORT).show();
}
}
}
My database SQLiteOpenHelper class
public class DBHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "MyDBName.db";
public static final String TABLE_SAMPLE = "sample";
public DBHelper(Context context)
{
super(context, DATABASE_NAME , null, 1);
}
public void onCreate(SQLiteDatabase db) {
String CREATE_SAMPLE_TABLE = "CREATE TABLE sample ( " +
"id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"one TEXT, "+
"two TEXT, "+
"three TEXT )";
db.execSQL(CREATE_SAMPLE_TABLE);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS sample");
onCreate(db);
}
public boolean insertsample (String one, String two, String three)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues myValues = new ContentValues();
myValues.put(one, one);
myValues.put(two, two);
myValues.put(three, three);
db.insert(TABLE_SAMPLE, null, myValues);
return true;
}
}
LOG message
E/AndroidRuntime(1153): FATAL EXCEPTION: main
E/AndroidRuntime(1153): Process: com.ezycode.pos, PID: 1153
E/AndroidRuntime(1153): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ezycode.pos/com.ezycode.pos.MainInvoiceActivity}: java.lang.NullPointerException
E/AndroidRuntime(1153): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
E/AndroidRuntime(1153): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
E/AndroidRuntime(1153): at android.app.ActivityThread.access$800(ActivityThread.java:135)
E/AndroidRuntime(1153): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
E/AndroidRuntime(1153): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(1153): at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime(1153): at android.app.ActivityThread.main(ActivityThread.java:5017)
E/AndroidRuntime(1153): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(1153): at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime(1153): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
E/AndroidRuntime(1153): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
E/AndroidRuntime(1153): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(1153): Caused by: java.lang.NullPointerException
E/AndroidRuntime(1153): at com.ezycode.pos.MainInvoiceActivity.onCreate(MainInvoiceActivity.java:67)
E/AndroidRuntime(1153): at android.app.Activity.performCreate(Activity.java:5231)
E/AndroidRuntime(1153): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
E/AndroidRuntime(1153): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
Correct code will be like something below
public class MainInvoiceActivity extends Activity {
private DBHelper mydb ;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_invoice);
mydb = new DBHelper(this); //This is missing your code.
if ( mydb.insertsample( "one" , "two" , "3" )){ // LINE NO 67
Toast.makeText(getApplicationContext(), "Insert Success!", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(), "not done", Toast.LENGTH_SHORT).show();
}
}
Related
When i am trying to display the contacts in card view when i click on Button it shows fatal exception error it doesnot display cardview anyone can solve this programming with brillliance and another error is it show only one cardview when i click on again the app will be strucked?
Showcontacts.java
public class ShowContacts extends Activity
{
private SQLiteDatabase db;
DbOperations doo;
private List<Contacts> contactsList;
private RecyclerView rv;
private Cursor c;
String names,email,address;
int phone;
String read_query = "select * from"+ ContactsTask.ContactsEntry.TABLE_NAME;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recycle_layout);
doo = new DbOperations(this);
openDatabase();
rv = (RecyclerView)findViewById(R.id.recyclerview);
initializeData();
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
rv.setLayoutManager(linearLayoutManager);
rv.setHasFixedSize(true);
ContactAdapter cc = new ContactAdapter(contactsList);
rv.setAdapter(cc);
}
public void initializeData() {
contactsList = new ArrayList<>();
c = db.rawQuery(read_query,null);
c.moveToFirst();
while (!c.isLast())
{
names = c.getString(0);
phone = c.getInt(1);
email = c.getString(2);
address = c.getString(3);
contactsList.add(new Contacts(names,phone,email,address));
}
c.isLast();
names = c.getString(0);
phone = c.getInt(1);
email = c.getString(2);
address = c.getString(3);
contactsList.add(new Contacts(names,phone,email,address));
}
private void openDatabase() {
db = openOrCreateDatabase("contactDB", Context.MODE_PRIVATE,null);
}
}
Logacat error
06-28 08:57:43.107 568-568/com.example.anilkumar.contactstask E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.anilkumar.contactstask/com.example.anilkumar.contactstask.ShowContacts}: android.database.sqlite.SQLiteException: near "fromcontacts": syntax error: , while compiling: select * fromcontacts
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.sqlite.SQLiteException: near "fromcontacts": syntax error: , while compiling: select * fromcontacts
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:127)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:53)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1564)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1538)
at com.example.anilkumar.contactstask.ShowContacts.initializeData(ShowContacts.java:44)
at com.example.anilkumar.contactstask.ShowContacts.onCreate(ShowContacts.java:34)
at android.app.Activity.performCreate(Activity.java:4466)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
Another logact error
06-28 13:14:40.552 11252-11261/com.example.anilkumar.contactstask E/SQLiteDatabase: close() was never explicitly called on database '/data/data/com.example.anilkumar.contactstask/databases/contactDB'
android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1943)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1007)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1043)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1036)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:761)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:215)
at com.example.anilkumar.contactstask.ShowContacts.openDatabase(ShowContacts.java:66)
at com.example.anilkumar.contactstask.ShowContacts.onCreate(ShowContacts.java:33)
at android.app.Activity.performCreate(Activity.java:4466)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
Just update
String read_query = "select * from"+ ContactsTask.ContactsEntry.TABLE_NAME;
to
String read_query = "select * from "+ ContactsTask.ContactsEntry.TABLE_NAME;
Always close cursor. update your initializeData method
public void initializeData() {
try {
contactsList = new ArrayList<>();
try{
c = db.rawQuery(read_query,null);
c.moveToFirst();
while (!c.isLast())
{
names = c.getString(0);
phone = c.getInt(1);
email = c.getString(2);
address = c.getString(3);
contactsList.add(new Contacts(names,phone,email,address));
}
c.isLast();
names = c.getString(0);
phone = c.getInt(1);
email = c.getString(2);
address = c.getString(3);
contactsList.add(new Contacts(names,phone,email,address));
} catch (Exception e) {
// exception handling
} finally {
if(c != null){
c.close();
}
}
}
I am having an issue with my college project. I am trying to delete a row from my one of my tables using the following query.
//---deletes a particular match---
public boolean deleteMatch(String name) {
SQLiteDatabase sqLiteDatabase = getWritableDatabase();
return sqLiteDatabase.delete(TABLE_FIXTURES, MATCH_OPPONENT + " = " + name, null) > 0;
}
Here I am trying to delete a record based upon the match_opponent and passing the String value name.
I am then calling this method in my EditSchedule activity below:
public class EditSchedule extends AppCompatActivity {
public Button fixtureSearch;
public EditText opponentName;
public String searchTerm;
ListView editMatch;
DBHelper dbHelper = new DBHelper(this);
SQLiteDatabase sqLiteDatabase;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_editfixture);
editMatch = (ListView) findViewById(R.id.listViewEditMatch);
opponentName = (EditText) findViewById(R.id.fixtureOpponentDelete);
searchTerm = opponentName.getText().toString();
fixtureSearch = (Button) findViewById(R.id.fixtureSearchButton);
fixtureSearch.setOnClickListener(
new View.OnClickListener() {
#Override
public void onClick(View v) {
dbHelper.deleteMatch(searchTerm);
}
}
);
}
}
So when I test my application by typing in a name of an opponent that I have in the fixture table and clicking on the delete button, I get the following error:
01-06 07:49:42.476 25778-25778/com.example.myacer.clubhub E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.database.sqlite.SQLiteException: near "=": syntax error (code 1): , while compiling: DELETE FROM fixtures WHERE match_opponent =
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1494)
at com.example.myacer.clubhub.database.DBHelper.deleteMatch(DBHelper.java:243)
at com.example.myacer.clubhub.manager.EditSchedule$1.onClick(EditSchedule.java:47)
at android.view.View.performClick(View.java:4240)
at android.view.View$PerformClick.run(View.java:17721)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Can anyone see where I am going wrong? All help greatly appreciated.
You are passing blank value in deleteMatch(), put searchTerm = opponentName.getText().toString(); inside onClick()
fixtureSearch.setOnClickListener(
new View.OnClickListener() {
#Override
public void onClick(View v) {
searchTerm = opponentName.getText().toString();
dbHelper.deleteMatch(searchTerm);
}
}
);
As well as change your deleteMatch() method
sqLiteDatabase.delete(TABLE_FIXTURES, MATCH_OPPONENT + " = ?",new String[]{name});
try this:
sqLiteDatabase.delete(TABLE_FIXTURES, MATCH_OPPONENT + " = ?", new String[]{name})
This question already has an answer here:
Android NullPointerException + GetDatabaseLocked
(1 answer)
Closed 7 years ago.
I have a problem NullPointerException on getWritableDatabase()
Database
I am trying to build a small application that store some information in a SQLite table. But I always receive a "Java.lang.NullPointerException" exception in getWritableDatabase method. Can anyone help me? All the code is below.
public class PacienteDatabase extends SQLiteOpenHelper {
private static final String DB_NAME = "paciente.sqlite";
private static final int VERSION = 1;
private static final String TABLE = "paciente";
public PacienteDatabase(Context context) {
super(context, DB_NAME, null, VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
// Crear tabla paciente
db.execSQL("create table paciente (" +
"_id integer primary key autoincrement, start_date integer)");
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
Activiy
public class RegistroPaciente extends ActionBarActivity {
private Button mBotonOk;
private PacienteDatabase mPaciente;
private Context c;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_registro_paciente);
mPaciente = new PacienteDatabase(c);
mBotonOk = (Button)findViewById(R.id.boton_registro_ok);
mBotonOk.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
ContentValues datos = new ContentValues();
datos.put("start_date", 1000 );
mPaciente.getWritableDatabase().insert("paciente", null, datos);
finish();
}
});
}
Error in log cat
03-16 22:22:46.531 1181-1181/com.example.franciscodelgadogarcia.projecto E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.franciscodelgadogarcia.projecto, PID: 1181
java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at com.example.franciscodelgadogarcia.projecto.RegistroPaciente$1.onClick(RegistroPaciente.java:84)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
c object of Context is null initialize it before passing cto PacienteDatabase class constructor :
c=RegistroPaciente.this
mPaciente = new PacienteDatabase(c);
So I am trying out a tutorial for SQLite I have seen in the internet, and after tweaking it a bit I launched it and it crashes. Before modifying the code, it works. I know that some of the functions are deprecated, but that didn't seem to be the issue because as I said it ran before I modified it. I also know that the error is on line 44 on one of my classes (I have put a comment in this line to distinguish it) but I don't see why it gives me an error. Here is my code:
AndroidSQLite.java:
package com.example.sqlite;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class AndroidSQLite extends Activity {
EditText inputContent1, inputContent2, inputContent3;
Button buttonAdd, buttonDeleteAll;
private SQLiteAdapter mySQLiteAdapter;
ListView listContent;
SimpleCursorAdapter cursorAdapter;
Cursor cursor;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
inputContent1 = (EditText)findViewById(R.id.UserID);
inputContent2 = (EditText)findViewById(R.id.Password);
inputContent3 = (EditText)findViewById(R.id.Fname);
buttonAdd = (Button)findViewById(R.id.add);
buttonDeleteAll = (Button)findViewById(R.id.deleteall);
listContent = (ListView)findViewById(R.id.contentlist);
mySQLiteAdapter = new SQLiteAdapter(this);
mySQLiteAdapter.openToWrite();
cursor = mySQLiteAdapter.queueAll();
String[] from = new String[]{SQLiteAdapter.KEY_USERS_USERID, SQLiteAdapter.KEY_USERS_PASSWORD, SQLiteAdapter.KEY_USERS_FNAME};
int[] to = new int[]{R.id.id, R.id.text1, R.id.text2};
cursorAdapter = new SimpleCursorAdapter(this, R.layout.row, cursor, from, to);
listContent.setAdapter(cursorAdapter);
buttonAdd.setOnClickListener(buttonAddOnClickListener);
buttonDeleteAll.setOnClickListener(buttonDeleteAllOnClickListener);
}
Button.OnClickListener buttonAddOnClickListener = new Button.OnClickListener(){
#Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String data1 = inputContent1.getText().toString();
String data2 = inputContent2.getText().toString();
String data3 = inputContent3.getText().toString();
mySQLiteAdapter.insert(data1, data2, data3);
updateList();
}
};
Button.OnClickListener buttonDeleteAllOnClickListener = new Button.OnClickListener(){
#Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
mySQLiteAdapter.deleteAll();
updateList();
}
};
#Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mySQLiteAdapter.close();
}
#SuppressWarnings("deprecation")
private void updateList(){
cursor.requery();
}
}
SQLiteAdapter.java
package com.example.sqlite;
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;
public class SQLiteAdapter {
public static final String DB_NAME = "adserve";
public static final String DB_TABLE_USERS = "users";
public static final int DB_VERSION = 1;
public static final String KEY_USERS_USERID = "_id";
public static final String KEY_USERS_PASSWORD = "Password";
public static final String KEY_USERS_FNAME = "Fname";
//create table MY_DATABASE (ID integer primary key, Content text not null);
private static final String SCRIPT_CREATE_DATABASE =
"create table " + DB_TABLE_USERS + " ("
+ KEY_USERS_USERID + " integer primary key, "
+ KEY_USERS_PASSWORD + " text not null, "
+ KEY_USERS_FNAME + " text not null);";
private SQLiteHelper sqLiteHelper;
private SQLiteDatabase sqLiteDatabase;
private Context context;
public SQLiteAdapter(Context c){
context = c;
}
public SQLiteAdapter openToRead() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, DB_NAME, null, DB_VERSION);
sqLiteDatabase = sqLiteHelper.getReadableDatabase();
return this;
}
public SQLiteAdapter openToWrite() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, DB_NAME, null, DB_VERSION);
sqLiteDatabase = sqLiteHelper.getWritableDatabase();
return this;
}
public void close(){
sqLiteHelper.close();
}
public long insert(String UserID, String Password, String Fname){
ContentValues contentValues = new ContentValues();
contentValues.put(KEY_USERS_USERID, UserID);
contentValues.put(KEY_USERS_PASSWORD, Password);
contentValues.put(KEY_USERS_FNAME, Fname);
return sqLiteDatabase.insert(DB_TABLE_USERS, null, contentValues);
}
public int deleteAll(){
return sqLiteDatabase.delete(DB_TABLE_USERS, null, null);
}
public Cursor queueAll(){
String[] columns = new String[]{KEY_USERS_USERID, KEY_USERS_PASSWORD, KEY_USERS_FNAME};
Cursor cursor = sqLiteDatabase.query(DB_TABLE_USERS, columns, null, null, null, null, null);
return cursor;
}
public class SQLiteHelper extends SQLiteOpenHelper {
public SQLiteHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
#Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(SCRIPT_CREATE_DATABASE);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
}
And my logcat:
02-20 10:04:53.811: E/AndroidRuntime(1940): FATAL EXCEPTION: main
02-20 10:04:53.811: E/AndroidRuntime(1940): Process: com.example.sqlite, PID: 1940
02-20 10:04:53.811: E/AndroidRuntime(1940): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sqlite/com.example.sqlite.AndroidSQLite}: java.lang.IllegalArgumentException: column '_id' does not exist
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.app.ActivityThread.access$700(ActivityThread.java:135)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.os.Handler.dispatchMessage(Handler.java:102)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.os.Looper.loop(Looper.java:137)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.app.ActivityThread.main(ActivityThread.java:4998)
02-20 10:04:53.811: E/AndroidRuntime(1940): at java.lang.reflect.Method.invokeNative(Native Method)
02-20 10:04:53.811: E/AndroidRuntime(1940): at java.lang.reflect.Method.invoke(Method.java:515)
02-20 10:04:53.811: E/AndroidRuntime(1940): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
02-20 10:04:53.811: E/AndroidRuntime(1940): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
02-20 10:04:53.811: E/AndroidRuntime(1940): at dalvik.system.NativeStart.main(Native Method)
02-20 10:04:53.811: E/AndroidRuntime(1940): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.widget.CursorAdapter.init(CursorAdapter.java:172)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.widget.CursorAdapter.<init>(CursorAdapter.java:120)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:78)
02-20 10:04:53.811: E/AndroidRuntime(1940): at com.example.sqlite.AndroidSQLite.onCreate(AndroidSQLite.java:43)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.app.Activity.performCreate(Activity.java:5243)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
02-20 10:04:53.811: E/AndroidRuntime(1940): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
02-20 10:04:53.811: E/AndroidRuntime(1940): ... 11 more
Quoting the documentation for CursorAdapter:
The Cursor must include a column named "_id" or this class will not work
You do not have such a column in your Cursor, as far as I can tell.
One solution would be to switch from query() to rawQuery(), so you can add ROWID AS _id to your list of columns, to fulfil the CursorAdapter contract.
The SQLite Site says,
In SQLite, table rows normally have a 64-bit signed integer ROWID which is unique among all rows in the same table. (WITHOUT ROWID tables are the exception.)
So if you want to use a column only as an integer primary key, you can directly access the in built one using ROWID.
and the document on Cursor adapter says,
The Cursor must include a column named "_id" or this class will not work. Additionally, using MergeCursor with this class will not work if the merged Cursors have overlapping values in their "_id" columns.
which is the error you are getting.
Also if searched, you could find solution to yours on already answered SO questions like this one.
I am working on a simple app for myself that posts information to a database. I'm really new at this and tried to follow some tutorials along with other tidbits to assemble this.
There is a home screen that gets to the second screen which has a button (add item). Onclicking, this is supposed to build/update the database. I get a crash when I enter that second screen before anything happens. I tried to put in breakpoints to debug but I can't even to get anywhere. It doesn't pause at my breakpoints (or doesn't seem to) so I can't see what's going on
Can anyone point in the right direction for debugging/fixing this?
This is my 2nd screen code - java
public class AddItem extends Activity {
private final String TAG = "Main Activity";
View view;
SQLiteDatabase db;
DbPrice dbprice ;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_item);
Log.i(TAG, "OnCreate");
dbprice = new DbPrice(this);
db = dbprice.getWritableDatabase();
Button addButton = (Button) findViewById(R.id.addNew);
addButton.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
String subcat,item,store,extra;
Integer day,month,year,price,quantity,weight,volume;
Boolean sale;
DatePicker datePicker1 = (DatePicker) findViewById(R.id.datePicker1);
AutoCompleteTextView autoCompleteSubCat = (AutoCompleteTextView) findViewById(R.id.autoCompleteSubCat);
EditText editItem = (EditText) findViewById(R.id.editItem);
EditText editPrice = (EditText) findViewById(R.id.editPrice);
EditText editQuantity = (EditText) findViewById(R.id.editQuantity);
EditText editWeight = (EditText) findViewById(R.id.editWeight);
EditText editVolume = (EditText) findViewById(R.id.editVolume);
CheckBox checkSale = (CheckBox) findViewById(R.id.checkSale);
AutoCompleteTextView autoCompleteStore = (AutoCompleteTextView) findViewById(R.id.autoCompleteStore);
EditText editExtra = (EditText) findViewById(R.id.editExtra);
day = datePicker1.getDayOfMonth();
month = datePicker1.getMonth();
year = datePicker1.getYear();
subcat = autoCompleteSubCat.getText().toString();
item = editItem.getText().toString();
extra = editExtra.getText().toString();
price = Integer.parseInt(editPrice.getText().toString());
quantity = Integer.parseInt(editQuantity.getText().toString());
weight = Integer.parseInt(editWeight.getText().toString());
volume = Integer.parseInt(editVolume.getText().toString());
// sale = checkSale.isChecked();
store = autoCompleteStore.getText().toString();
ContentValues cv = new ContentValues();
cv.put(DbPrice.SUBCAT, subcat);
cv.put(DbPrice.ITEM, item);
cv.put(DbPrice.EXTRA, extra);
cv.put(DbPrice.PRICE, price);
cv.put(DbPrice.QUANTITY, quantity);
cv.put(DbPrice.WEIGHT, weight);
cv.put(DbPrice.VOLUME, volume);
cv.put(DbPrice.SALE, sale);
cv.put(DbPrice.STORE, store);
db.insert(DbPrice.TABLE_NAME, null, cv);
}
});
}
#Override
public void onStart() {
super.onStart();
Log.i(TAG, "OnStart");
}
#Override
public void onResume() {
super.onResume();
Log.i(TAG, "OnResume");
}
public void OnPause() {
super.onPause();
Log.i(TAG,"OnPause");
}
public void OnStop() {
super.onStart();
Log.i(TAG, "OnStop");
}
public void OnDestroy() {
super.onDestroy();
Log.i(TAG, "OnDestroy");
}
public void addNewItem (View v) {
Log.i(TAG, "Starting New Activity");
Intent intent = new Intent (this, AllItems.class);
startActivity(intent);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.add_item, menu);
return true;
}
}
The database class java is below. I don't know if you need the xml too but I included the catlog.
public class DbPrice extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "data";
public static final String TABLE_NAME = "price_table";
public static final String C_ID = "_id";
public static final String DAY = "day";
public static final String MONTH = "month";
public static final String YEAR = "day";
public static final String SUBCAT = "subcategory";
public static final String ITEM = "item";
public static final String PRICE = "price";
public static final String QUANTITY = "quantity";
public static final String WEIGHT = "weight";
public static final String VOLUME = "volume";
public static final String SALE = "sale";
public static final String STORE = "store";
public static final String EXTRA = "extra";
public static final int VERSION = 1;
private final String createDb = "create table if not exists " + TABLE_NAME+ " ( "
+ C_ID + " integer primary key autoincrement, "
+ DAY + " text, "
+ MONTH + " text, "
+ YEAR + " text, "
+ SUBCAT + " text, "
+ ITEM + " text, "
+ PRICE + " text, "
+ QUANTITY + " text, "
+ WEIGHT + " text, "
+ VOLUME + " text, "
+ SALE + " text, "
+ STORE + " text, "
+ EXTRA + " text) ";
public DbPrice(Context context) {
super(context, DATABASE_NAME, null, VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createDb);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
db.execSQL("drop table " + TABLE_NAME);
}
}
CATLOG BELOW
12-29 01:27:20.834: I/Main Activity(1362): OnCreate
12-29 01:27:21.044: E/SQLiteLog(1362): (1) duplicate column name: day
12-29 01:27:21.054: D/AndroidRuntime(1362): Shutting down VM
12-29 01:27:21.064: W/dalvikvm(1362): threadid=1: thread exiting with uncaught exception (group=0xb4b11b90)
12-29 01:27:21.194: E/AndroidRuntime(1362): FATAL EXCEPTION: main
12-29 01:27:21.194: E/AndroidRuntime(1362): Process: com.unsuccessfulstudent.grocerypricehistory, PID: 1362
12-29 01:27:21.194: E/AndroidRuntime(1362): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.unsuccessfulstudent.grocerypricehistory/com.unsuccessfulstudent.grocerypricehistory.AddItem}: android.database.sqlite.SQLiteException: duplicate column name: day (code 1): , while compiling: create table if not exists price_table ( _id integer primary key autoincrement, day text, month text, day text, subcategory text, item text, price text, quantity text, weight text, volume text, sale text, store text, extra text)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.app.ActivityThread.access$700(ActivityThread.java:135)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.os.Handler.dispatchMessage(Handler.java:102)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.os.Looper.loop(Looper.java:137)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.app.ActivityThread.main(ActivityThread.java:4998)
12-29 01:27:21.194: E/AndroidRuntime(1362): at java.lang.reflect.Method.invokeNative(Native Method)
12-29 01:27:21.194: E/AndroidRuntime(1362): at java.lang.reflect.Method.invoke(Method.java:515)
12-29 01:27:21.194: E/AndroidRuntime(1362): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
12-29 01:27:21.194: E/AndroidRuntime(1362): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
12-29 01:27:21.194: E/AndroidRuntime(1362): at dalvik.system.NativeStart.main(Native Method)
12-29 01:27:21.194: E/AndroidRuntime(1362): Caused by: android.database.sqlite.SQLiteException: duplicate column name: day (code 1): , while compiling: create table if not exists price_table ( _id integer primary key autoincrement, day text, month text, day text, subcategory text, item text, price text, quantity text, weight text, volume text, sale text, store text, extra text)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1672)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603)
12-29 01:27:21.194: E/AndroidRuntime(1362): at com.unsuccessfulstudent.grocerypricehistory.DbPrice.onCreate(DbPrice.java:49)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
12-29 01:27:21.194: E/AndroidRuntime(1362): at com.unsuccessfulstudent.grocerypricehistory.AddItem.onCreate(AddItem.java:31)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.app.Activity.performCreate(Activity.java:5243)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-29 01:27:21.194: E/AndroidRuntime(1362): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
12-29 01:27:21.194: E/AndroidRuntime(1362): ... 11 more
12-29 01:27:24.554: I/Process(1362): Sending signal. PID: 1362 SIG: 9
The reason for your app crash is caused by the fact that in your database creation query you are defining the same key twice. Thats why you are getting a duplicate column error.
Both the keys you have,i.e., DAY as well as YEAR have the same value day. You cannot have two columns in a database with the same name. So, to resolve this, all you need to do is change the YEAR definition to-
public static final String YEAR = "year";
Hope this helps!!!
You use two same columns
DAY = "day";
YEAR = "day";
Code:
create table if not exists price_table
(
_id integer primary key autoincrement,
"**day**" text,
month text,
"**day**" text,...
)
Whenever there is an Exception, if you see a line FATAL EXCEPTION: main in Logcat, look at the below lines. The line with Unable to start activity ComponentInfo, will give you a clear idea about the cause of exception. Still if you are confused, look for a line starting with Caused by:.
So here your problem is "duplicate column name: day".
Also you can navigate to the specific line which caused the exception. Just look for your package name. Here in this case,
12-29 01:27:21.194: E/AndroidRuntime(1362): at com.unsuccessfulstudent.grocerypricehistory.DbPrice.onCreate(DbPrice.java:49)
12-29 01:27:21.194: E/AndroidRuntime(1362): at com.unsuccessfulstudent.grocerypricehistory.AddItem.onCreate(AddItem.java:31)
At the end of the lines, There is corresponding class and line number. Note that these are the lines caused exception, but the cause of exception may be somewhere else. In this case, String YEAR