I have a spinner. I want to load data from sqlite. I have try to load data with Activity class, it work but i want to load it in Fragment class and i got the method is undefined. There is any wrong ? What should i do ??
Sorry for my bad english..
This is Fragment class
public class InfoJadwal extends Fragment {
private DatabaseHandler dbhelper;
private SQLiteDatabase db = null;
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dbhelper = new DatabaseHandler(getActivity());
db = dbhelper.getWritableDatabase();
dbhelper.delAllData(db);
dbhelper.generateData(db);
View rootView = inflater.inflate(R.layout.info_jadwal, container,
false);
loadDataSpinner();
return rootView;
}
private void loadDataSpinner() {
Cursor wisataCursor;
Spinner colourSpinner = (Spinner) getView().findViewById(
R.id.spin_tujuan);
wisataCursor = dbhelper.fetchAllWisata(db);
startManagingCursor(wisataCursor);
String[] from = new String[] { dbhelper.TUJUAN };
int[] to = new int[] { R.id.tvDBViewRow };
SimpleCursorAdapter wisataAdapter = new SimpleCursorAdapter(this,
R.layout.db_view_row, wisataCursor, from, to);
colourSpinner.setAdapter(wisataAdapter);
}
#Override
public void onDestroy() {
super.onDestroy();
try {
db.close();
} catch (Exception e) {
}
}
}
And this is class for DatabaseHandler.
public class DatabaseHandler extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "medantrain";
public static final String TUJUAN = "tujuan";
public static final String KEY_ID = "_id";
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, 1);
}
// method createTable untuk membuat table WISATA
public void createTable(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS KOTA");
db.execSQL("CREATE TABLE if not exists KOTA (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "TUJUAN TEXT);");
}
// method generateData untuk mengisikan data ke table Wisata.
public void generateData(SQLiteDatabase db) {
ContentValues cv = new ContentValues();
cv.put(TUJUAN, "Binjai");
db.insert("KOTA", TUJUAN, cv);
cv.put(TUJUAN, "Rantau Prapat");
db.insert("KOTA", TUJUAN, cv);
cv.put(TUJUAN, "Tebing Tinggi");
db.insert("KOTA", TUJUAN, cv);
}
// method delAllAdata untuk menghapus data di table Wisata.
public void delAllData(SQLiteDatabase db) {
db.delete("KOTA", null, null);
}
public Cursor fetchAllWisata(SQLiteDatabase db) {
return db.query("KOTA", new String[] { KEY_ID, TUJUAN }, null, null,
null, null, null);
}
#Override
public void onCreate(SQLiteDatabase db) {
createTable(db);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
replace
SimpleCursorAdapter wisataAdapter = new SimpleCursorAdapter(this,R.layout.db_view_row, wisataCursor, from, to);
with
SimpleCursorAdapter wisataAdapter = new SimpleCursorAdapter(getActivity(),R.layout.db_view_row, wisataCursor, from, to);
and replace
startManagingCursor(wisataCursor);
with
getActivity().startManagingCursor(wisataCursor);
but startManagingCursor(Cursor) in Activity is deprecated. see docs for more info http://developer.android.com/reference/android/app/Activity.html#startManagingCursor%28android.database.Cursor%29
SimpleCursorAdapter requires a Context reference but you are passing this which means a Fragment reference.
Related
I am trying to save the chat history in SQLite database. When I write to database, the app returns non-zero value so it is almost write to database correctly, But when I try to read the database data, the cursor returns 0 and no data retrieved form database.
here is the code for creating database:
public class ChatDatabaseHelp extends SQLiteOpenHelper {
static String DATABASE_NAME;
static int VERSION_NUM=1;
public static String KEY_ID="key_id",KEY_MESSAGE="message";
public static String TABLE_NAME="messages";
public ChatDatabaseHelp(Context ctx)
{
super(ctx,DATABASE_NAME,null,VERSION_NUM);
}
#Override
public void onCreate(SQLiteDatabase db) {
String SQL="CREATE TABLE messages(key_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,message TEXT NOT NULL)";
db.execSQL(SQL);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
here is the code where I write and read from database:
public class ChatWindow extends AppCompatActivity {
EditText t_send;
Button send;
ChatAdapter messageAdapter;
ListView listView;
private SQLiteDatabase db;
ArrayList<String> list;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_window);
t_send=(EditText)findViewById(R.id.editText);
list= new ArrayList<String>();
send=(Button)findViewById(R.id.button3);
listView=(ListView)findViewById(R.id.listview);
messageAdapter=new ChatAdapter(this);
listView.setAdapter(messageAdapter);
final ChatDatabaseHelp helper=new ChatDatabaseHelp(this);
db=helper.getWritableDatabase();
System.out.println("hiiii"+helper.TABLE_NAME);
Cursor cursor=db.rawQuery("select * from messages " , null);
while (cursor.moveToNext()) {
list.add(cursor.getString(1));
messageAdapter.notifyDataSetChanged();
}
send.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
ContentValues cv=new ContentValues();
cv.put(helper.KEY_MESSAGE,t_send.getText().toString());
db.insert(helper.TABLE_NAME,null,cv);
list.add(t_send.getText().toString());
t_send.setText("");
messageAdapter.notifyDataSetChanged();
}
});
}
private class ChatAdapter extends ArrayAdapter<String> {
public ChatAdapter(Context ctx){
super(ctx,0);
}
public int getCount()
{
return list.size();
}
public String getItem(int position)
{
return list.get(position);
}
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater=ChatWindow.this.getLayoutInflater();
View result=null;
if(position%2==0){
result=inflater.inflate(R.layout.chat_row_ingoing,null);
TextView message=(TextView)result.findViewById(R.id.message_text_in);
message.setText(getItem(position));}
else{
result=inflater.inflate(R.layout.chat_row_outgoing,null);
TextView message=(TextView)result.findViewById(R.id.message_text_out);
message.setText(getItem(position));}
return result;
}
}
#Override
protected void onDestroy() {
db.close();
super.onDestroy();
}
}
you have first write data into db then after read data if table is empty cursor give 0 value. above your code first read data into table that time is not found any data there for cursor give 0 value.
you used two button read and write into db.
first write data into db that code in below.
write.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
db=helper.getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(helper.KEY_MESSAGE,t_send.getText().toString());
db.insert(helper.TABLE_NAME,null,cv);
list.add(t_send.getText().toString());
t_send.setText("");
messageAdapter.notifyDataSetChanged();
}
});
then after read the data into db below code..
read.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
db=helper.getReadableDatabase();
Cursor cursor=db.rawQuery("select * from messages " , null);
if (cursor != null) {
cursor.moveToFirst();
while (cursor.isAfterLast() == false) {
list.add(cursor.getString(cursor.getColumnIndex("message"));
messageAdapter.notifyDataSetChanged();
cursor.moveToNext();
}
}
}
});
I have a problem with recycler, the problem is: I have AsyncTask which query data from my db, and then updating recycler by CursorLoader, but adapter doesn't fill recycler, Logs says that the data from db is successfully reading and then Adapter constructor successfully takes ArrayList with data, but that's all, logs says that adapter's methods doesn't call.
MainActivity :
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private SQLiteDatabase db;
private SimpleCursorLoader loader;
private MySimpleAdapter adapter;
private RecyclerView recycler;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recycler = (RecyclerView) findViewById(R.id.recycler);
new SimpleTask(SimpleTask.OPEN, null).execute();
}
private class SimpleTask extends AsyncTask<Void, Void, Void> {
public static final int INSERT = 0;
public static final int DELETE = 1;
public static final int OPEN = 2;
private int task;
private String name;
public SimpleTask(int task, String name) {
this.task = task;
this.name = name;
}
#Override
protected Void doInBackground(Void... params) {
switch (task) {
case INSERT :
ContentValues values = new ContentValues();
values.put(SimpleHelper.KEY_NAME, name);
db.insert(SimpleHelper.TABLE_NAME, null, values);
break;
case DELETE :
db.delete(SimpleHelper.TABLE_NAME, SimpleHelper.KEY_NAME + " = ? ", new String[]{name});
break;
case OPEN :
if (db == null) {
try {
db = new SimpleHelper(MainActivity.this).getWritableDatabase();
} catch (SQLiteException e) {
e.printStackTrace();
}
}
break;
}
return null;
}
#Override
protected void onPostExecute(Void aVoid) {
if (loader == null) {
loader = new SimpleCursorLoader(MainActivity.this, db);
loader.setQueryParams(SimpleHelper.TABLE_NAME, new String[]{SimpleHelper.KEY_NAME},
null, null);
getSupportLoaderManager().initLoader(0, null, MainActivity.this);
}
getSupportLoaderManager().getLoader(0).forceLoad();
}
}
#Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return loader;
}
#Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
Log.i("MyLog", "onLoadFinished cursor size is " + data.getCount());
List<String> items = new ArrayList<>();
data.moveToFirst();
do {
items.add(data.getString(0));
Log.i("MyLog", data.getString(0));
} while (data.moveToNext());
Log.i("MyLog", "onLoadFinished items size is " + items.size());
if (adapter == null) {
adapter = new MySimpleAdapter(items);
recycler.setAdapter(adapter);
} else {
adapter.updateAdapter(items);
}
}
#Override
public void onLoaderReset(Loader<Cursor> loader) {
}
private class MySimpleAdapter extends RecyclerView.Adapter<MySimpleAdapter.MyHolder> {
private List<String> items;
public MySimpleAdapter(List<String> items) {
Log.i("MyLog", "Constructor called with items size " + items.size());
this.items = items;
}
public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tvText;
public MyHolder(View itemView) {
super(itemView);
tvText = (TextView) itemView.findViewById(android.R.id.text1);
itemView.setOnClickListener(this);
}
#Override
public void onClick(View v) {
new SimpleTask(SimpleTask.DELETE, tvText.getText().toString());
}
}
public void updateAdapter(List<String> items) {
this.items = items;
notifyDataSetChanged();
}
#Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Log.i("MyLog", "onCreateViewHolder");
View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, null, false);
return new MyHolder(view);
}
#Override
public void onBindViewHolder(MyHolder holder, int position) {
holder.tvText.setText(items.get(position));
Log.i("MyLog", "onBindViewHolder setText : " + items.get(position));
}
#Override
public int getItemCount() {
Log.d("MyLog", "getItemCount called with size : " + items.size());
return items.size();
}
}
SimpleCursorLoader :
public class SimpleCursorLoader extends CursorLoader {
private SQLiteDatabase db;
private String tableName;
private String[] columns;
public SimpleCursorLoader(Context context, SQLiteDatabase db) {
super(context);
this.db = db;
}
public void setQueryParams(String tableName, String[] columns, String selection, String[] selectionArgs) {
this.tableName = tableName;
this.columns = columns;
setSelection(selection);
setSelectionArgs(selectionArgs);
}
#Override
public Cursor loadInBackground() {
Cursor cursor = db.query(tableName, columns, getSelection(), getSelectionArgs(),
null, null, null);
return cursor;
}
DBHelper :
public class SimpleHelper extends SQLiteOpenHelper{
public static final String TABLE_NAME = "users";
public static final String KEY_NAME = "name";
public static final String KEY_ID = "_id";
private static final int DB_VERSION = 1;
private static final String DB_NAME = "SimpleDB";
public SimpleHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME + "("
+ KEY_ID + " integer primary key autoincrement, "
+ KEY_NAME + " text)");
for (int i = 0; i < 5; i ++) {
ContentValues values = new ContentValues();
values.put(KEY_NAME, "name" + i+1);
db.insert(TABLE_NAME, null, values);
Log.i("MyLog", "inserted");
}
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
activity_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Use this.
recycler.setLayoutManager(new LinearLayoutManager(this));
recycler.setHasFixedSize(true);
recycler.setNestedScrollingEnabled(false);
I have a listview and a SQL database. In my SQL database, there is a title and a content field. I display titles on a listview. Now this is what I'm trying to achieve: When I click the title, this should pass me to another activity and in this activity I want to see relative content in edittext. And sorry for my poor English.
This is my code.
DB CLASS.
public class NoteAlDatabase extends SQLiteOpenHelper {
private static final String VERITABANI_ISMI = "veritabanim2.db";
private static final int VERITABANI_VERSION = 1;
private static final String TABLO_ISMI = "noteAlTablosu";
public static final String ID = "_id";
public static final String NOTEBASLIK= "noteTitle";
public static final String NOTEICERIK = "noteContent";
final Context c;
private SQLiteDatabase db;
public NoteAlDatabase(Context context) {
super(context, VERITABANI_ISMI, null, VERITABANI_VERSION);
this.c = context;
}
#Override
public void onCreate(SQLiteDatabase db) {
String tablo_olustur = "CREATE TABLE " + TABLO_ISMI +
" ("+ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
NOTEBASLIK + " TEXT, " +
NOTEICERIK + " TEXT);";
db.execSQL(tablo_olustur);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXIST " + TABLO_ISMI);
onCreate(db);
}
public NoteAlDatabase abrirBaseDeDatos() throws SQLException {
NoteAlDatabase noteAlDatabase = new NoteAlDatabase(c);
noteAlDatabase.getWritableDatabase();
return this;
}
public long addReminder(NoteAlModel noteAl) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(ID, noteAl.getNoteAlID());
cv.put(NOTEBASLIK, noteAl.getNoteAlBaslik());
cv.put(NOTEICERIK, noteAl.getNoteAlIcerik());
// tarih'te eklenecek /long cinsinden
long id = db.insert(TABLO_ISMI,null,cv);
db.close();
return id;
}
public List<NoteAlModel> AllData() {
SQLiteDatabase db = this.getReadableDatabase();
String[] sutunlar = new String[]{ID,NOTEBASLIK,NOTEICERIK};
Cursor c =db.query(TABLO_ISMI, sutunlar,null,null,null,null,null);
int idsirano = c.getColumnIndex(ID);
int basliksirano = c.getColumnIndex(NOTEBASLIK);
int iceriksirano = c.getColumnIndex(NOTEICERIK);
List<NoteAlModel> liste = new ArrayList<NoteAlModel>();
for (c.moveToFirst();!c.isAfterLast();c.moveToNext()){
NoteAlModel noteAlModel = new NoteAlModel();
noteAlModel.setNoteAlID(c.getString(idsirano));
noteAlModel.setNoteAlBaslik(c.getString(basliksirano));
noteAlModel.setNoteAlIcerik(c.getString(iceriksirano));
liste.add(noteAlModel);
}
db.close();
return liste;
}
public void Sil(){
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLO_ISMI, null, null);
}
ListViewActivity:
public class NoteListele extends AppCompatActivity {
ListView listView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_note_listele);
Button btn = (Button) findViewById(R.id.btnYeniNotKaydet);
btn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Intent intent = new Intent(NoteListele.this, NoteAlActivity.class);
startActivity(intent);
}
});
try {
displayListview();
} catch (Exception e) {
Toast.makeText(NoteListele.this, "Listelenecek veri bulunmamakta", Toast.LENGTH_SHORT).show();
}
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
});
}
public void displayListview() {
NoteAlDatabase db = new NoteAlDatabase(getApplicationContext());
List<NoteAlModel> liste = new ArrayList<NoteAlModel>();
liste = db.AllData();
ArrayAdapter arrayAdapter = new ArrayAdapter<NoteAlModel>(this, android.R.layout.simple_list_item_1, liste);
listView.setAdapter(arrayAdapter);
}
public void deleteAllData(View view) {
NoteAlDatabase db = new NoteAlDatabase(getApplicationContext());
db.Sil();
//displayListview();
}
GETSET Model:
public class NoteAlModel {
private String noteAlID;
private String noteAlBaslik;
private String noteAlIcerik;
public NoteAlModel() {
}
public NoteAlModel(String noteAlID, String noteAlBaslik, String noteAlIcerik) {
this.noteAlID = noteAlID;
this.noteAlBaslik = noteAlBaslik;
this.noteAlIcerik = noteAlIcerik;
}
public NoteAlModel(String noteAlBaslik, String noteAlIcerik) {
this.noteAlBaslik = noteAlBaslik;
this.noteAlIcerik = noteAlIcerik;
}
public String getNoteAlID() {
return noteAlID;
}
public void setNoteAlID(String noteAlID) {
this.noteAlID = noteAlID;
}
public String getNoteAlBaslik() {
return noteAlBaslik;
}
public void setNoteAlBaslik(String noteAlBaslik) {
this.noteAlBaslik = noteAlBaslik;
}
public String getNoteAlIcerik() {
return noteAlIcerik;
}
public void setNoteAlIcerik(String noteAlIcerik) {
this.noteAlIcerik = noteAlIcerik;
}
logcat
03-06 20:16:46.095 4886-4886/reminderplus.reminder2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: reminderplus.reminder2, PID: 4886
java.lang.NoSuchMethodError: No virtual method AllData()Landroid/database/Cursor; in class Lreminderplus/reminder2/veritabani/NoteAlDatabase; or its super classes (declaration of 'reminderplus.reminder2.veritabani.NoteAlDatabase' appears in /data/data/reminderplus.reminder2/files/instant-run/dex/slice-slice_9_4376acd355cb0a9e536cff445d1b4b60f3d0940d-classes.dex)
at reminderplus.reminder2.noteal.NoteListele.onCreate(NoteListele.java:46)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
You have not to convert your Cursor into List<NoteAlModel>. You can use Cursor with SimpleCursorAdapter.
In this case your AllData Method will look like:
public Cursor AllData() {
SQLiteDatabase db = this.getReadableDatabase();
String[] sutunlar = new String[]{ID,NOTEBASLIK,NOTEICERIK};
Cursor c = db.query(TABLO_ISMI, sutunlar,null,null,null,null,null);
db.close();
return c;
}
Then you create a SimpleCursorAdapter and set it to your ListView
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
db.AllData(),
new String[] { NoteAlDatabase.NOTEBASLIK },
new int[] { android.R.id.text1 });
listView.setAdapter(scAdapter);
After that you have a ListView with your "titles" and now let's manage your setOnItemClickListener to open a "content" in new activtiy.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String content = ((SimpleCursorAdapter)parent.getAdapter()).
getCursor().getString(NoteAlDatabase.NOTEICERIK);
Intent intent = new Intent(getApplicationContext(), ContentActivity.class);
intent.putExtra("PARAM", content);
startActivity(intent);
}
});
And now you can obtain the content in ContentActivity's onCreate method
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
//...
String content = getIntent().getExtras().getString("PARAM", "");
// show content in some `TextView`
}
I'm trying to update a listview with user entries into two text inputs. Once the save button is clicked, the user's entry should appear. Based on my code, the listview updates the first time I fill out the two text inputs and I hit save, but the second time I hit save, the listview does not update. Here's my code:
Home.java
public class Home extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
EditText inputOne;
EditText inputTwo;
MyDBHandler dbHandler;
Button saveButton;
MyCursorAdapter cursorAdapter;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
inputOne = (EditText) findViewById(R.id.inputOne);
inputTwo = (EditText) findViewById(R.id.inputTwo);
dbHandler = new MyDBHandler(this, null, null, 1);
saveButton = (Button) findViewById(R.id.saveButton);
MyDBHandler myDBHandler = new MyDBHandler(this);
Cursor c = myDBHandler.getCursor();
cursorAdapter = new MyCursorAdapter(this,c,1);
ListView notes = (ListView) findViewById(R.id.notes);
notes.setAdapter(cursorAdapter);
public void saveClicked(View view) {
Test test = new Test( inputOne.getText().toString(), inputTwo.getText().toString() );
dbHandler.addTest(test);
inputOne.setText("");
inputTwo.setText("");
cursorAdapter.notifyDataSetChanged();
}
MyDBHandler.java
public class MyDBHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "Database.db";
public static final String TABLE_TEST = "test";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_ONE = "one";
public static final String COLUMN_TWO = "two";
public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE " + TABLE_TEST + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
COLUMN_ONE + " TEXT," +
COLUMN_TWO + " TEXT" + ");";
db.execSQL(query);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_TEST);
onCreate(db);
}
public void addTest(Test test){
ContentValues values = new ContentValues();
values.put(COLUMN_ONE, test.get_one());
values.put(COLUMN_TWO, test.get_two());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_TEST, null, values);
db.close();
}
public Cursor getCursor(){
SQLiteDatabase db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_ACTIVITIES + " WHERE 1";
Cursor c = db.rawQuery(query, null);
return c;
}
}
MyCursorAdapter.java
public class MyCursorAdapter extends CursorAdapter {
public MyCursorAdapter(Context context, Cursor c, int flags) {
super(context, c, 1);
}
#Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.custom_row, parent, false);
}
#Override
public void bindView(View view, Context context, Cursor cursor) {
TextView one = (TextView) view.findViewById(R.id.one);
TextView two = (TextView) view.findViewById(R.id.two);
String one_string = cursor.getString(cursor.getColumnIndexOrThrow(MyDBHandler.COLUMN_ONE));
one.setText(one_string);
String two_string = cursor.getString(cursor.getColumnIndexOrThrow(MyDBHandler.COLUMN_TWO));
two.setText(two_string);
}
}
Test.java
public class Test {
private int _id;
private String _one;
private String _two;
public Test(){
}
public Test(int id){
this._id = id;
}
public Test(String one, String two){
this._one = one;
this._two = two;
}
public int get_id() {
return _id;
}
public void set_id(int _id) {
this._id = _id;
}
public String get_one() {
return _one;
}
public void set_one(String _one) {
this._one = _one;
}
public String get_two() {
return _two;
}
public void set_two(String _two) {
this._two = _two;
}
The correct way to refresh a ListView backed by a Cursor is to call cursorAdapter.notifyDatasetChanged(), without needing to recreate and reset the adapter.
So in your saveClicked method you just update the db and let the Adapter know there has been a change.
To do this, you'll need to keep a reference to the adapter as an instance field instead of declaring it as a local variable.
Turns out my ListView was populating, but I made the mistake of putting a ListView inside of a ScrollView - so I wasn't able to see the addition of entries. It worked once I used the solution from this: Android - ListView's height just fits 1 ListView item
I'm trying to create table in the sqlite, but it is showing error that table cannot be created. I have a same code but the database and table name are different. the fields are same. Also one doubt. Can't i create the different table in the same database containing the same fields.
DbAdapter.java
the code is as below.
public class DbAdapter {
private static final String DATABASE_NAME="bible1";
private static final String DATABASE_TABLE="test1";
private static final int DATABASE_VERSION=1;
public static final String KEY_ID="_id";
public static final String UNITS="units";
public static final String CHAPTERS="chapters";
private static final String CREATE_DATABASE="create table test1 (_id integer primary key autoincrement, units text not null, chapters text not null);";
private SQLiteHelper sqLiteHelper;
private static SQLiteDatabase sqLiteDatabase;
private Context context;
//constructor
public DbAdapter(Context c){
context = c;
}
private static class SQLiteHelper extends SQLiteOpenHelper{
public SQLiteHelper(Context context){
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREATE_DATABASE);
MakeUnits();
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
public DbAdapter open() throws SQLException{
try{
sqLiteHelper = new SQLiteHelper(context);
sqLiteDatabase = sqLiteHelper.getWritableDatabase();
}catch(NullPointerException ne){
Log.e("error in creating the table", "bye");
}
return this;
}
public void close(){
sqLiteHelper.close();
}
public static long MakeUnits()
{
ContentValues insert1 = new ContentValues();
insert1.put(UNITS, "Unit1");
insert1.put(CHAPTERS, "CHAPTER1");
return sqLiteDatabase.insert(DATABASE_TABLE,null,insert1);
}
public Cursor fetchAllNotes(){
return sqLiteDatabase.query(DATABASE_TABLE, new String[]{KEY_ID,UNITS,CHAPTERS}, null, null, null, null, null);
}
}
MainActivity.java
public class MainActivity extends ListActivity {
private DbAdapter Database;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listContent = (ListView) findViewById(android.R.id.list);
Database= new DbAdapter(this);
Database.open();
Cursor c = Database.fetchAllNotes();
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
It is giving error when the open() method is called. Couldn't figure it out.
in the logcat the error in the tag is that "error in creating the table"
You're trying to call sqLiteDatabase.insert inside MakeUnits, but this sqLiteDatabase variable is null until after you call getWritableDatabase. You should pass db to MakeUnits and call insert on db, not on sqLiteDatabase.
database will be created only when you make a call to
getWritableDatabase()/getReadableDatabase()
If you do not have permissions for a writable db, you will get a readable
db.
public SQLiteDatabase getWritableDB() {
try {
return helper.getWritableDatabase();
} catch (Exception e) {
return getReadableDB();
}
}
public SQLiteDatabase getReadableDB() {
return helper.getReadableDatabase();
}