开发者社区> 问答> 正文

Android数据库SQLite的使用示例:报错

Android 提供了三种数据存储方式,第一种是文件存储;第二种是SharedPreferences存储;第三种就是数据库SQLiteDatabase存储。文件存储我就不用多说了,而SharedPreferences可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列。Android高手进阶教程(七)之----Android 中Preferences的使用!
今天我们将讲一下SQLiteDatabase的使用。而掌握SqliteDatabase,将会我们接下来掌握ContentProvider打下良好的基石。为了让大家更好的掌握,我们手把手完成该节的Demo。

第一步:新建一个Android工程,命名为SQLiteDatabaseDemo.


第二步:创建一个新的类BooksDB.java这个类要继承于android.database.sqlite.SQLiteOpenHelper抽象类,我们要实现其中两个方法:onCreate(),onUpdate.具体代码如下:
package com.android.tutor; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
public class BooksDB extends SQLiteOpenHelper { 
private final static String DATABASE_NAME = "BOOKS.db"; 
private final static int DATABASE_VERSION = 1; 
private final static String TABLE_NAME = "books_table"; 
public final static String BOOK_ID = "book_id"; 
public final static String BOOK_NAME = "book_name"; 
public final static String BOOK_AUTHOR = "book_author"; 

public BooksDB(Context context) { 
// TODO Auto-generated constructor stub 
super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 
//创建table 
@Override 
public void onCreate(SQLiteDatabase db) { 
String sql = "CREATE TABLE " + TABLE_NAME + " (" + BOOK_ID 
+ " INTEGER primary key autoincrement, " + BOOK_NAME + " text, "+ BOOK_AUTHOR +" text);"; 
db.execSQL(sql); 
} 
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
String sql = "DROP TABLE IF EXISTS " + TABLE_NAME; 
db.execSQL(sql); 
onCreate(db); 
} 

public Cursor select() { 
SQLiteDatabase db = this.getReadableDatabase(); 
Cursor cursor = db 
.query(TABLE_NAME, null, null, null, null, null, null); 
return cursor; 
} 
//增加操作 
public long insert(String bookname,String author) 
{ 
SQLiteDatabase db = this.getWritableDatabase(); 
/* ContentValues */ 
ContentValues cv = new ContentValues(); 
cv.put(BOOK_NAME, bookname); 
cv.put(BOOK_AUTHOR, author); 
long row = db.insert(TABLE_NAME, null, cv); 
return row; 
} 
//删除操作 
public void delete(int id) 
{ 
SQLiteDatabase db = this.getWritableDatabase(); 
String where = BOOK_ID + " = ?"; 
String[] whereValue ={ Integer.toString(id) }; 
db.delete(TABLE_NAME, where, whereValue); 
} 
//修改操作 
public void update(int id, String bookname,String author) 
{ 
SQLiteDatabase db = this.getWritableDatabase(); 
String where = BOOK_ID + " = ?"; 
String[] whereValue = { Integer.toString(id) }; 

ContentValues cv = new ContentValues(); 
cv.put(BOOK_NAME, bookname); 
cv.put(BOOK_AUTHOR, author); 
db.update(TABLE_NAME, cv, where, whereValue); 
} 
}

第三步:修改main.xml布局如下,由两个EditText和一个ListView组成,代码如下:
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<EditText 
android:id="@+id/bookname" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
> 
</EditText> 
<EditText 
android:id="@+id/author" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
> 
</EditText> 
<ListView 
android:id="@+id/bookslist" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
> 
</ListView> 
</LinearLayout> 

第四步:修改SQLiteDatabaseDemo.java代码如下:
package com.android.tutor; 
import android.app.Activity; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.BaseAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 
public class SQLiteDatabaseDemo extends Activity implements AdapterView.OnItemClickListener { 
private BooksDB mBooksDB; 
private Cursor mCursor; 
private EditText BookName; 
private EditText BookAuthor; 
private ListView BooksList; 

private int BOOK_ID = 0; 
protected final static int MENU_ADD = Menu.FIRST; 
protected final static int MENU_DELETE = Menu.FIRST + 1; 
protected final static int MENU_UPDATE = Menu.FIRST + 2; 

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
setUpViews(); 
} 

public void setUpViews(){ 
mBooksDB = new BooksDB(this); 
mCursor = mBooksDB.select(); 

BookName = (EditText)findViewById(R.id.bookname); 
BookAuthor = (EditText)findViewById(R.id.author); 
BooksList = (ListView)findViewById(R.id.bookslist); 

BooksList.setAdapter(new BooksListAdapter(this, mCursor)); 
BooksList.setOnItemClickListener(this); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
super.onCreateOptionsMenu(menu); 

menu.add(Menu.NONE, MENU_ADD, 0, "ADD"); 
menu.add(Menu.NONE, MENU_DELETE, 0, "DELETE"); 
menu.add(Menu.NONE, MENU_DELETE, 0, "UPDATE"); 
return true; 
} 

public boolean onOptionsItemSelected(MenuItem item) 
{ 
super.onOptionsItemSelected(item); 
switch (item.getItemId()) 
{ 
case MENU_ADD: 
add(); 
break; 
case MENU_DELETE: 
delete(); 
break; 
case MENU_UPDATE: 
update(); 
break; 
} 
return true; 
} 

public void add(){ 
String bookname = BookName.getText().toString(); 
String author = BookAuthor.getText().toString(); 
//书名和作者都不能为空,或者退出 
if (bookname.equals("") || author.equals("")){ 
return; 
} 
mBooksDB.insert(bookname, author); 
mCursor.requery(); 
BooksList.invalidateViews(); 
BookName.setText(""); 
BookAuthor.setText(""); 
Toast.makeText(this, "Add Successed!", Toast.LENGTH_SHORT).show(); 
} 

public void delete(){ 
if (BOOK_ID == 0) { 
return; 
} 
mBooksDB.delete(BOOK_ID); 
mCursor.requery(); 
BooksList.invalidateViews(); 
BookName.setText(""); 
BookAuthor.setText(""); 
Toast.makeText(this, "Delete Successed!", Toast.LENGTH_SHORT).show(); 
} 

public void update(){ 
String bookname = BookName.getText().toString(); 
String author = BookAuthor.getText().toString(); 
//书名和作者都不能为空,或者退出 
if (bookname.equals("") || author.equals("")){ 
return; 
} 
mBooksDB.update(BOOK_ID, bookname, author); 
mCursor.requery(); 
BooksList.invalidateViews(); 
BookName.setText(""); 
BookAuthor.setText(""); 
Toast.makeText(this, "Update Successed!", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

mCursor.moveToPosition(position); 
BOOK_ID = mCursor.getInt(0); 
BookName.setText(mCursor.getString(1)); 
BookAuthor.setText(mCursor.getString(2)); 

} 

public class BooksListAdapter extends BaseAdapter{ 
private Context mContext; 
private Cursor mCursor; 
public BooksListAdapter(Context context,Cursor cursor) { 

mContext = context; 
mCursor = cursor; 
} 
@Override 
public int getCount() { 
return mCursor.getCount(); 
} 
@Override 
public Object getItem(int position) { 
return null; 
} 
@Override 
public long getItemId(int position) { 
return 0; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
TextView mTextView = new TextView(mContext); 
mCursor.moveToPosition(position); 
mTextView.setText(mCursor.getString(1) + "___" + mCursor.getString(2)); 
return mTextView; 
} 

} 
} 

第五步:运行程序效果如下:






第六步:查看我们所建的数据库。有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。
另一种方法是用DDMS查看,在data/data下面对应的应用程序的包名 下会有如下数据库,如图所示:

展开
收起
kun坤 2020-06-06 16:33:10 918 0
1 条回答
写回答
取消 提交回答
  • ######如何用自已外部创建的数据库?######外部数据库,你指的是手机上的数据库吗,还是服务器的?######有图有源码~~这样的代码分享看着才舒服
    ######楼主,下面三个键都没显示啊,效果只有两个edittext啊######回复 @j67065 : 按menu那里才有的######运行后,我也是这样的效果,只有上面两个EditText,下面三个都没有,listview也没显示######bjhgjhgjgjhghj######

    学习中,mark先

    ######

    引用来自“西瓜可乐”的答案

    学习中,mark先


    ######谢谢分享!!! ######新同学。。学习中。。。谢谢大师们分享啊
    ######

    好像有错误啊


    2020-06-06 16:33:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载