simple SQLite code for android

I am trying to write my first SQLite database program with android. a simple program in which with pressing a button I add some data to the data base, and by pressing another button read data from it, and show it with toast. unfortunately the program doesn't work ! I am not sure is it because the data base is not made or the reading process has problem. The program is compiling and SPK file is made, but when I press the button to read from database my tablet will hang and exit the app. the codes are here:

public class MainActivity extends ActionBarActivity {
    Button btn1,btn2 ;
    bookBD db = new bookBD(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn1 = (Button) findViewById(R.id.bbtn1);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                db.AddBook("one",1,"the first comment");
                db.AddBook("two",2,"the second comment");
            }
        });
        btn2 = (Button) findViewById(R.id.bbtn2);
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Cursor cr = (new) db.GetBook(1);
                Toast.makeText(MainActivity.this, cr.getString(cr.getColumnIndex(bookname)) , Toast.LENGTH_LONG).show();
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

and the database code is:

class bookBD extends SQLiteOpenHelper {
    public static final String DB_name = "1sttry.db";
    public static final String Table_Name= "Bookdb";
    public static final String DB_id = "id";
    public static final String DB_bookname = "bookname";
    public static final String DB_price = "price";
    public static final String DB_content = "content";
    private static final String[] COLUMNS = {DB_id,DB_bookname,DB_price,DB_content};
    private static final String[] Columns = {DB_id,DB_bookname,DB_price,DB_content};
    public bookBD(Context context){
        super(context, DB_name, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_PRODUCTS_TABLE = "CREATE TABLE " + Table_Name + "("
                + DB_id + " INTEGER PRIMARY KEY," + DB_bookname
                + " bookname," + DB_price + " INTEGER" + DB_content + " CONTENT" + ")";
        db.execSQL(CREATE_PRODUCTS_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS books"+Table_Name);
        this.onCreate(db);
    }

    public void AddBook(String Bname, int Bprice, String Bcontent){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(DB_bookname,Bname);
        values.put(DB_price,Bprice);
        values.put(DB_content,Bcontent);
        db.insert(Table_Name,null,values);
        db.close();
    }
    public Cursor GetBook(int id){

        SQLiteDatabase db = this.getReadableDatabase();
    Cursor res ; 
        res =  db.rawQuery( "select * from contacts where id="+id+"", null );
    // or 
        //res = db.query (Table_Name,Columns, DB_id + "=?", new String[] { String.valueOf(id) }, null, null, null, null);
        if (res != null)
            res.moveToFirst();
        return res;
    }
}

does anybody know why my codes are not working?

Answers


You miss a space here:

+ " bookname," + DB_price + " INTEGER" + DB_content + " CONTENT" + ")";  

The table is not created.

Try this:

+ " bookname," + DB_price + " INTEGER " + DB_content + " CONTENT" + ")";

Also here:

db.execSQL("DROP TABLE IF EXISTS books"+Table_Name);

It should be:

db.execSQL("DROP TABLE IF EXISTS books "+Table_Name);

Change

Cursor cr = (new) db.GetBook(1);

to

Cursor cr = db.GetBook(1);

Also in GetBook() method use the query method you have commented.


Need Your Help

Using vb.net dll in unmanaged c++ project

c++ vb.net com dll interop

I created a vb.net dll called "WSdll.dll".

Using == or .Equals() on nulls and string.Empty

c# null string

In reference to using .Equals() or == on strings, here is a question in regards to checking for string.Empty and null objects.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.