一、基础知识:

运用场景:

  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基本操作的更多相关文章

  1. Android 的 Sqlite基本操作

    在 SQL 数据库中保存数据 使用数据库 将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选. 本课程假定您基本熟悉 SQL 数据库并且可帮助您开始在 Android 中使用 SQL ...

  2. sqlite基本操作

    sqlite准备步骤; .下载:https://www.sqlite.org/download.html: sqlite-dll-win64-3250200.zip 和 sqlite-tools-wi ...

  3. 【转】C# 对sqlite基本操作,带批量插入

    原文地址:https://download.csdn.net/download/mic_gary/10154869 public class SQLiteHelper { //数据库连接字符串 pub ...

  4. 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 ...

  5. SQLite基本操作-----IOS(如有雷同,纯属巧合)

    一.常用方法 sqlite3          *db, 数据库句柄,跟文件句柄FILE很类似 sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好 ...

  6. Sqlite库的基本操作

    Sqlite 基本操作 打开数据库 sqlite3* SQ_DB; char *zErrMsg = 0; int nRes = sqlite3_open("test.db", &a ...

  7. android SQLite数据库的基本操作

    SQLite是Android使用的轻量级的数据库,开发Android应用是对数据库的操作自然是必不可少. Android提供了一个SQLiteOpenHelper类来可以很方便的操作数据库, 继承和扩 ...

  8. python_way day18 html-day4, Django路由,(正则匹配页码,包含自开发分页功能), 模板, Model(jDango-ORM) : SQLite,数据库时间字段插入的方法

    python_way day18 html-day4 1.Django-路由系统   - 自开发分页功能 2.模板语言:之母板的使用 3.SQLite:model(jDango-ORM) 数据库时间字 ...

  9. Android——SQLite/数据库 相关知识总结贴

    android SQLite简介 http://www.apkbus.com/android-1780-1-1.html Android SQLite基础 http://www.apkbus.com/ ...

随机推荐

  1. Android:dimen尺寸资源文件的使用(转)

    为了适配不同的分辨率. dimen.xml在values文件夹下面 <resources> <!-- Default screen margins, per the Android ...

  2. Codeforces Round #14 D. Two Paths(求树上两条不相交的路径的乘积最大值)

    题目链接:  http://codeforces.com/problemset/problem/14/D 思路:直接枚举每一天路径的两端,然后求以每一端为树根的树上最长路径,然后相乘就可以了. # ...

  3. windows下mongodb安装与使用整理

    一.首先安装mongodb 1.下载地址:http://www.mongodb.org/downloads 2.解压缩到自己想要安装的目录,比如d:\mongodb 3.创建文件夹d:\mongodb ...

  4. 软考之PV操作(同步)

    这几天,陆续有那么三两个同学跟我讨论了一下关于软考上的PV操作的题,吾虽不才,但还是把同学们讲通了,在此,特分享一下自己的思路和想法,愿对大家有点帮助! 下面,我们就通过自己做过的试卷上两道题来分析: ...

  5. 关于MFC OpenGL环境配置的一点总结

    复制include时要小心..看vs给你load哪一个..名字一样..东西可不一定一样哦 http://www.cppblog.com/wicbnu/archive/2010/09/30/128123 ...

  6. 【设计模式】MVC模式

    MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO.它 ...

  7. AJAX案例二:简单表单验证

    案例:如果用户名输入为张三,那么在失去焦点时后面会显示该用户名已被注册,否则显示可以注册! <%@ page language="java" import="jav ...

  8. javascript引擎工作原理

    1. 什么是JavaScript解析引擎? 简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序.比方说,当你写了 var a = 1 + ...

  9. loopback 01

    关于loopback的相关blog 安装: 官网 $ mkdir office-supplies $ cd office-supplies $ slc loopback $ slc loopback: ...

  10. Js+XML 操作

    xml文件Login.xml如下. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?> <L ...