--------------------------------------
SQLite数据库--------------------------------------
Android自带SQLite工具类SQLiteOpenHelper
- 先自定义一个类继承自SQLiteOpenHelper
- 创建一个构造方法
- 重写两个创建数据库的方法onCreate()和onUpgrade(),分别是创建和更新数据库。
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
//数据库生成
public void onCreate(SQLiteDatabase sqLiteDatabase) {
}
@Override
//数据库升级
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
- 构造方法第二个参数是数据库的名称。第三个是游标工厂,数据库查询结果的对象,Cursor相当于一个指针,每读取一个游标下移。一般游标设置为null。Version数据库版本。
- 在onCreate()方法中创建表。 sqLiteDatabase。execSQL(""); SQLite官网SQLite.org其中有SQL操作语句
- 在MainActivity中的onCreate中创建DBOpenHelper对象,并且传入参数。
DBOpenHelper helper=new DBOpenerHelper(this,"数据库名称.db",null,1);
- 调用可写的方法。返回对象是SQLite数据库
SQLiteDatabase databaseWriter=helper.getWritableDatabase();
- 然后创建一个ContentValues对象,它是Android封装的一条数据
ContentValues cv=new ContentValues();
cv.put("name","小张");
cv.put("sex","男");
- 向可写的数据库中插入数据,调用insert("表名","空列的填充用null",values);方法 //values就是上述的对象
databaseWriter.insert("user",null,cv);
databaseWriter.close();
- 创建可读的方法。
- 调用query("表名",”返回哪几列的数据“,”查询的条件“,”查询的条件的参数“,”“,”“,"")方法查询数据。
- 返回哪几列的数据返回的是一个数组,如查询name列,可写为new String[]{"name"},null默认返回所有列数据。
- 查询的条件的参数返回的是一个字符串数组。 返回Cursor(游标)类型对象
- 调用query("表名",”返回哪几列的数据“,”查询的条件“,”查询的条件的参数“,”“,”“,"")方法查询数据。
Cursor c=dbRead.query("user",new String[]{"name","sex"},"name=?",new String[]{"小张" },null,null);
- 利用循环移到下一个数据,读值
while(c.moveToNext()){
String name = c.getString(c.getColumnIndex("name")); //利用列的索引获取用户名
String sex=c.getString(c.getColumnIndex("sex"));
}
将数据呈现在ListView中
- 主类需要继承ListActivity
- layout中添加ListView
- 利用Curson对象创建一个SimpleCursonAdapter对象
- private SimpleCursonAdapter adapter;
- adapter=newSimpleCursonAdapter(context,layout,Cursor,from,to);
- 创建两个显示文本,显示用户名和性别
adapter=new SimpleCursonAdapter(this,layout,c,new String[]{"name","sex"},new int[]{R.id.tvName,R.id.tvSex});
- 使用setListAdapter呈现
setListAdapter(adapter);
- 如果使用Android中的SimpleCursonAdapter,必须要求数据库中有一列名为”_id"。
- 因此要回到工具类SQLiteOpenHelper中的onCreate方法中,在执行创建table语句中添加一列"_id integer primary key autoincrement"
sqliteDatabase.execSQL("create table user(_id integer primary key autoincrement,name text default null,sex text default null)");
在layout中创建两个文本框和一个添加按钮,用于添加用户名和性别数据。
分别在主类中声明,添加按钮创建监听。
//全局中定义
private
DBOpenHelper helper;private SQLiteDatabase databaseWriter,databaseRead;private Onclick btnAddListener=new OnClickListener(){
public void onClick(View v){
ContentValues cv = new ContentValues();
cv.put("name",et_name.getText().toString());cv.put("sex",et_sex.getText().toString());databaseWriter.insert("user",null,cv);refreshListView();}
};
btn_add.setOnClickListener(btnAddListener);
将Cursor的数据库查询方法放到一个新的方法refreshListView()中,可以保持
ListView
的刷新状态。
private void refreshListView(){ //两次调用该方法 类中调用一次。
Cursor c = databaseRead.query("user",null,null,null,null,null,null);
adapter.changeCursor(c);
}
设置弹出对话框,将某一条数据删除
- 设置列表项的长按监听事件
getListView().setOnItemLongCilckListener(new OnItemLongCilckListener(
public boolean onItemLongClick(AdapterView<?> parent,View view,final int position,long id){
new AlertDialog.Builder(MainActivity.this).setTitle("提醒").setMessage("您确定要删除该项吗").setNegativeButton("取消",null).setPositiveButton("确定",new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
Cursor c = adapeter.getCursor();
c.moveToPosition(position);
int itemId=c.getInt(c.getColunmIndex("_id"):
databaseWriter.delete("user","_id=?",new String[]{itemId+""});
refreshListView();
}
}).show();//创建一个弹出对话框
return true; //是否执行长按
}
));
------------------完整代码------------------
DBOpenHelper
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by 59666 on 2016/10/20.
*/
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table user(_id integer primary key autoincrement,name text default null,sex text default null)");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
主类
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper;
private SimpleCursorAdapter adapter;
private SQLiteDatabase sqliteWrite, sqliteRead;
private EditText et_name, et_sex;
private Button btn_add;
private ListView list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbOpenHelper = new DBOpenHelper(this, "users", null, 1);
sqliteWrite = dbOpenHelper.getReadableDatabase();
sqliteRead = dbOpenHelper.getReadableDatabase();
list = (ListView) findViewById(R.id.list_item);
et_name = (EditText) findViewById(R.id.et_name);
et_sex = (EditText) findViewById(R.id.et_sex);
btn_add = (Button) findViewById(R.id.btn_add);
refreshListView();
list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, final int position, long id) {
new AlertDialog.Builder(MainActivity.this).setTitle("提示消息").setMessage("您确定要删除该条数据吗").setNegativeButton("取消", null).setPositiveButton("废话", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Cursor c = adapter.getCursor();
c.moveToPosition(position);
int itemId = c.getInt(c.getColumnIndex("_id"));
sqliteWrite.delete("user", "_id=?", new String[]{itemId + ""});
refreshListView();
}
}).show();
return true;
}
});
btn_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ContentValues cv = new ContentValues();
cv.put("name", et_name.getText().toString().trim());
cv.put("sex", et_sex.getText().toString().trim());
sqliteWrite.insert("user", null, cv);
refreshListView();
}
});
}
private void refreshListView() {
Cursor c = sqliteRead.query("user", null, null, null, null, null, null);
adapter = new SimpleCursorAdapter(this, R.layout.user_layout, c, new String[]{"name", "sex"}, new int[]{R.id.tv_name, R.id.tv_sex});
list.setAdapter(adapter);
adapter.changeCursor(c);
}
}
主XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
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="com.example.user.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true">
<EditText
android:id="@+id/et_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="用户名" />
<EditText
android:id="@+id/et_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_alignParentBottom="true"
android:layout_toEndOf="@+id/tv_sex"
android:hint="性别" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:id="@+id/btn_add"
android:text="添加数据"/>
</LinearLayout>
<ListView
android:id="@+id/list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</ListView>
</RelativeLayout>
次XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_marginStart="39dp"
android:layout_marginTop="17dp"
android:text="用户名" />
<TextView
android:id="@+id/tv_sex"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/tv_name"
android:layout_below="@+id/tv_name"
android:layout_marginTop="13dp"
android:text="性别" />
</LinearLayout>