zoukankan      html  css  js  c++  java
  • 练习一: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>

  • 相关阅读:
    Yield Usage Understanding
    Deadclock on calling async methond
    How to generate file name according to datetime in bat command
    Run Unit API Testing Which Was Distributed To Multiple Test Agents
    druid的关键参数+数据库连接池运行原理
    修改idea打开新窗口的默认配置
    spring boot -thymeleaf-url
    @pathvariable和@RequestParam的区别
    spring boot -thymeleaf-域对象操作
    spring boot -thymeleaf-遍历list和map
  • 原文地址:https://www.cnblogs.com/iamkk/p/5979005.html
Copyright © 2011-2022 走看看