练习一:SQLite基本操作
一、基础知识:
运用场景:
1>应用运行需要保存一系列有一定关系有一定结构的数据(文本也可以但是存储效率低)
2>文件类型:.db(一个数据库就是一个.db文件)
3>路径:/data/data/projectPackage/databases/xxx.db
4>默认其他应用不能访问
5>应用卸载时会删除数据
SQLite:
一款轻型关系数据库服务器,安装文件小(几百k,嵌入Android),支持多操作系统,支持多语言,处理速度快。
二、Android单元测试:
1、测试类继承AndroidTestCase
2、<!-- 使用安卓测试包application中 -->
<uses-library android:name="android.test.runner"/>
3、<!-- targetPackage的值与配置文件package值一致application外 -->
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.testsqlite"/>
三、实用ListActivity优化功能:
1、继承ListActivity
2、布局文件中<ListView>的id必须为系统定义的id:list
3、如果想在没有数据时显示一个提示文本,可在布局文件中定义一个<TextView>(id必须是 empty);
四、练习:
1、内容
使用SQLiteOpenHelper 、SQLiteDatabase、 Cursor对数据库进行操作;
使用ListView+BaseAdapter显示列表;
使用ContextMenu;
使用ListActivity.
2、一个功能的工作:
内存操作:集合/对象
存储操作:数据库/文件sp
界面操作:列表...。
3、数据库操作类
数据库帮助类
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "xrk.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("TAG", "DBHelper onCreate");
db.execSQL("create table black_number(_id integer primary key autoincrement,number varchar)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
数据库DAO
public class BlackNumberDao {
private DBHelper dbHelper;
public BlackNumberDao(Context context) {
dbHelper=new DBHelper(context);
}
/*
* 添加一条记录
* */
public void add(BlackNumber blackNumber){
//得到连接
SQLiteDatabase database=dbHelper.getWritableDatabase();
//执行insert
ContentValues values=new ContentValues();
values.put("number", blackNumber.getNumber());
long id=database.insert("black_number", null, values);
Log.i("TAG", "id="+id);
//设置id
blackNumber.setId((int) id);
//关闭
database.close();
}
/*
* 根据id删除一条记录
* */
public void deleteById(int id){
// 得到连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
// 执行delete
int deleteCount=database.delete("black_number", "_id=?",new String[]{id+""});
// 关闭
database.close();
}
/*
*更新一条记录
* */
public void update(BlackNumber blackNumber){
// 得到连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
// 执行update
ContentValues values=new ContentValues();
values.put("number", blackNumber.getNumber());
int updateCount=database.update("black_number", values, "_id="+blackNumber.getId(), null);
// 关闭
database.close();
}
/*查询所有记录 List<BlackNumber>
* */
public List<BlackNumber> getAll(){
List<BlackNumber> list=new ArrayList<BlackNumber>();
// 得到连接
SQLiteDatabase database = dbHelper.getReadableDatabase();
// 执行query
Cursor cursor=database.query("black_number", null, null, null, null, null, "_id desc");
while(cursor.moveToNext()){
int id=cursor.getInt(0);
String number=cursor.getString(1);
list.add(new BlackNumber(id,number));
}
// 关闭
cursor.close();
database.close();
return list;
}
}
单元测试类
/*
* 单元测试类
* */
public class BlackNumberDaoTest extends AndroidTestCase {
public void testAdd(){
//创建dao对象
BlackNumberDao dao=new BlackNumberDao(getContext());
//调用方法
dao.add(new BlackNumber(-1,"456"));
dao.add(new BlackNumber(-1,"123"));
}
public void testGetAll(){
BlackNumberDao dao=new BlackNumberDao(getContext());
List<BlackNumber> list=dao.getAll();
Log.i("TAG", list.toString());
}
}
控制类
public class MainActivity extends ListActivity {
private ListView lv_main;
private BlackNumberAdapter adapter;
private BlackNumberDao dao;
private List<BlackNumber> data;
int position;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_main=getListView();
adapter=new BlackNumberAdapter();
dao=new BlackNumberDao(this);
data=dao.getAll();
lv_main.setAdapter(adapter);
//给ListView设置创建contextMenu的监听
lv_main.setOnCreateContextMenuListener(this);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//添加item
menu.add(0, 1, 0, "更新");
menu.add(0, 2, 0, "删除");
//得到长按的position
AdapterContextMenuInfo info=(AdapterContextMenuInfo) menuInfo;
position=info.position;
}
@Override
public boolean onContextItemSelected(MenuItem item) {
//先根据position得到BlackNumber对象
BlackNumber blackNumber=data.get(position);
switch (item.getItemId()) {
case 1://更新
showUpdateDialog(blackNumber);
break;
case 2://删除
dao.deleteById(blackNumber.getId());
data.remove(position);
adapter.notifyDataSetChanged();
break;
default:
break;
}
return super.onContextItemSelected(item);
}
private void showUpdateDialog(final BlackNumber blackNumber) {
final EditText editText=new EditText(this);
editText.setHint(blackNumber.getNumber());
new AlertDialog.Builder(this)
.setTitle("添加黑名单")
.setView(editText)
.setPositiveButton("添加",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String newNumber=editText.getText().toString();
blackNumber.setNumber(newNumber);
dao.update(blackNumber);
//通知更新列表
adapter.notifyDataSetChanged();
}
})
.setNegativeButton("取消", null)
.show();
}
public void add(View v){
final EditText editText=new EditText(this);
editText.setHint("输入黑名单好");
new AlertDialog.Builder(this)
.setTitle("添加黑名单")
.setView(editText)
.setPositiveButton("添加",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String number=editText.getText().toString();
BlackNumber blackNumber=new BlackNumber(-1,number);
dao.add(blackNumber);
data.add(blackNumber);
//通知更新列表
adapter.notifyDataSetChanged();
}
})
.setNegativeButton("取消", null)
.show();
}
class BlackNumberAdapter extends BaseAdapter{
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView==null) {
convertView=View.inflate(MainActivity.this, android.R.layout.simple_list_item_1, null);
}
BlackNumber blackNumber=data.get(position);
TextView textView=(TextView) convertView.findViewById(android.R.id.text1);
textView.setText(blackNumber.getNumber());
return convertView;
}
}
}
布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
<TextView
android:id="@android:id/empty"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="0dp"
android:layout_weight="1"
android:text="还没有一个黑名单" />
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="add"
android:text="添加" />
</LinearLayout>
练习一:SQLite基本操作的更多相关文章
- Android 的 Sqlite基本操作
在 SQL 数据库中保存数据 使用数据库 将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选. 本课程假定您基本熟悉 SQL 数据库并且可帮助您开始在 Android 中使用 SQL ...
- sqlite基本操作
sqlite准备步骤; .下载:https://www.sqlite.org/download.html: sqlite-dll-win64-3250200.zip 和 sqlite-tools-wi ...
- 【转】C# 对sqlite基本操作,带批量插入
原文地址:https://download.csdn.net/download/mic_gary/10154869 public class SQLiteHelper { //数据库连接字符串 pub ...
- Android的SQLite基本操作
涉及SQLite的增删改查,结果用log显示 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...
- SQLite基本操作-----IOS(如有雷同,纯属巧合)
一.常用方法 sqlite3 *db, 数据库句柄,跟文件句柄FILE很类似 sqlite3_stmt *stmt, 这个相当于ODBC的Command对象,用于保存编译好 ...
- Sqlite库的基本操作
Sqlite 基本操作 打开数据库 sqlite3* SQ_DB; char *zErrMsg = 0; int nRes = sqlite3_open("test.db", &a ...
- android SQLite数据库的基本操作
SQLite是Android使用的轻量级的数据库,开发Android应用是对数据库的操作自然是必不可少. Android提供了一个SQLiteOpenHelper类来可以很方便的操作数据库, 继承和扩 ...
- python_way day18 html-day4, Django路由,(正则匹配页码,包含自开发分页功能), 模板, Model(jDango-ORM) : SQLite,数据库时间字段插入的方法
python_way day18 html-day4 1.Django-路由系统 - 自开发分页功能 2.模板语言:之母板的使用 3.SQLite:model(jDango-ORM) 数据库时间字 ...
- Android——SQLite/数据库 相关知识总结贴
android SQLite简介 http://www.apkbus.com/android-1780-1-1.html Android SQLite基础 http://www.apkbus.com/ ...
随机推荐
- usb设备驱动描述,王明学learn
usb设备驱动 本章主要内容包含以下:USB总线介绍,USB协议分析,USB系统架构 一.USB总线介绍 1.1USB发展史 USB(Universal Serial Bus)通用串行总线,是一种外部 ...
- ZEALER背后的乐视云视频
ZEALER是我非常喜欢的一个测评网站,经常访问看看手机.电动牙刷及机械键盘的测试视频,非常欣赏王自如的数据化测评理念.敬畏之心,以及不祛痘的视频. 刚好最近对网络视频应用比较感兴趣,觉得ZEALER ...
- .NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱
为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...
- Get open Popups
public IEnumerable<Popup> GetOpenPopups() { return PresentationSource.CurrentSources.OfType< ...
- 《数据结构与算法分析》学习笔记(五)——二叉树
(一)查找二叉树ADT 1.二叉查找树ADT性质: 对于树中的每个节点X,它的左子树中所有关键字值都小于X的关键字值,而它的右子树值的关键字值都大于X的关键字值. 2.一些ADT的基本操作 结 ...
- Redis学习笔记(1) Redis介绍及基础
1. Redis的特性 (1) 存储结构 Redis(Remote Dictionary Server,远程字典服务器)是以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容.Redis支 ...
- LoadRunner替换字符串(可以同时替换多个)
在global.h中添加代码 /* * @param char* dest 目标串,也就是替换后的新串 * @param const char* src 源字符串,被替换的字符串 * @param c ...
- ffmpeg处理RTMP流媒体的命令 发送流媒体的命令(UDP,RTP,RTMP)
将文件当做直播送至live ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName re限制输出速率,按照 ...
- hashlib加密操作模块
import hashlib#加密操作obj=hashlib.md5(bytes("hasdfghjklcxz",encoding="utf-8"))#加密操作 ...
- Uva 725 Division
0.不要傻傻的用递归去构造出一个五位数来,直接for循环最小到最大就好,可以稍微剪枝一丢丢,因为最小的数是01234 从1234开始,因为倍数n最小为2 而分子是一个最多五位数,所以分母应该小于五万. ...