• 练习一: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>

  • 相关阅读:
    Delphi / C++ Builder 使用 UDT ( UDP-based Data Transfer ) 4.11
    STUN: NAT 类型检测方法
    udt nat traverse
    UDT: Breaking the Data Transfer Bottleneck
    Freescale OSBDM JM60仿真器
    How To: Perl TCP / UDP Socket Programming using IO::Socket::INET
    NAT类型与穿透 及 STUN TURN 协议
    根据PID和VID得到USB转串口的串口号
    pic/at89c2051 programmer
    IC开短路测试(open_short_test),编程器测试接触不良、开短路
  • 原文地址:https://www.cnblogs.com/iamkk/p/5979005.html
Copyright © 2020-2023  润新知