Android 数据库SQLiteDatabase的使用!!

Android 高手进阶教程(二)之----Android 数据库SQLiteDatabase的使用!! 有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。第一步:新建一个Android工程,命名为SQLiteDatabaseDemo.2.Android Framework学习指南,助力成为系统级开发高手。5.Android Jetpack从入门到精通,构建高质量UI界面。10.Android零基础入门到精通,高手进阶之路。 阅读详情

\\

转载自:http://blog.youkuaiyun.com/android_tutor/article/details/5654124

大家好,好久没有更新博客了,最近由于身体不适让大家久等了,好了,直接进入主题~

Android 提供了三种数据存储方式,第一种是文件存储;第二种是SharedPreferences存储;第三种就是数据库SQLiteDatabase存储。

文件存储我就不用多说了,而SharedPreferences可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列。Android高手进阶教程(七)之----Android 中Preferences的使用!

今天我们将讲一下SQLiteDatabase的使用。而掌握SqliteDatabase,将会我们接下来掌握ContentProvider打下良好的基石。

为了让大家更好的掌握,我们手把手完成该节的Demo。

第一步:新建一个Android工程,命名为SQLiteDatabaseDemo.

第二步:创建一个新的类BooksDB.java这个类要继承于android.database.sqlite.SQLiteOpenHelper抽象类,我们要实现其中两个方法:onCreate(),onUpdate.具体代码如下:

  1. package com.android.tutor;  
  2. import android.content.ContentValues;  
  3. import android.content.Context;  
  4. import android.database.Cursor;  
  5. import android.database.sqlite.SQLiteDatabase;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7. public class BooksDB extends SQLiteOpenHelper {  
  8.       private final static String DATABASE_NAME = "BOOKS.db";  
  9.       private final static int DATABASE_VERSION = 1;  
  10.       private final static String TABLE_NAME = "books_table";  
  11.       public final static String BOOK_ID = "book_id";  
  12.       public final static String BOOK_NAME = "book_name";  
  13.       public final static String BOOK_AUTHOR = "book_author";  
  14.         
  15.       public BooksDB(Context context) {  
  16.         // TODO Auto-generated constructor stub  
  17.           super(context, DATABASE_NAME, null, DATABASE_VERSION);  
  18.     }  
  19.     //创建table  
  20.     @Override  
  21.     public void onCreate(SQLiteDatabase db) {  
  22.           String sql = "CREATE TABLE " + TABLE_NAME + " (" + BOOK_ID  
  23.             + " INTEGER primary key autoincrement, " + BOOK_NAME + " text, "+  BOOK_AUTHOR +" text);";  
  24.           db.execSQL(sql);  
  25.     }  
  26.     @Override  
  27.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  28.         String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;  
  29.         db.execSQL(sql);  
  30.         onCreate(db);  
  31.     }  
  32.       
  33.     public Cursor select() {  
  34.         SQLiteDatabase db = this.getReadableDatabase();  
  35.         Cursor cursor = db  
  36.                 .query(TABLE_NAME, null, null, null, null, null, null);  
  37.         return cursor;  
  38.     }  
  39.     //增加操作  
  40.      public long insert(String bookname,String author)  
  41.       {  
  42.         SQLiteDatabase db = this.getWritableDatabase();  
  43.         /* ContentValues */  
  44.         ContentValues cv = new ContentValues();  
  45.         cv.put(BOOK_NAME, bookname);  
  46.         cv.put(BOOK_AUTHOR, author);  
  47.         long row = db.insert(TABLE_NAME, null, cv);  
  48.         return row;  
  49.       }  
  50.      //删除操作  
  51.       public void delete(int id)  
  52.       {  
  53.         SQLiteDatabase db = this.getWritableDatabase();  
  54.         String where = BOOK_ID + " = ?";  
  55.         String[] whereValue ={ Integer.toString(id) };  
  56.         db.delete(TABLE_NAME, where, whereValue);  
  57.       }  
  58.       //修改操作  
  59.       public void update(int id, String bookname,String author)  
  60.       {  
  61.         SQLiteDatabase db = this.getWritableDatabase();  
  62.         String where = BOOK_ID + " = ?";  
  63.         String[] whereValue = { Integer.toString(id) };  
  64.         
  65.         ContentValues cv = new ContentValues();  
  66.         cv.put(BOOK_NAME, bookname);  
  67.         cv.put(BOOK_AUTHOR, author);  
  68.         db.update(TABLE_NAME, cv, where, whereValue);  
  69.       }  
  70. }  

 

 

第三步:修改main.xml布局如下,由两个EditText和一个ListView组成,代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.   android:orientation="vertical"  
  4.   android:layout_width="fill_parent"  
  5.   android:layout_height="fill_parent"  
  6.   >  
  7.       <EditText    
  8.       android:id="@+id/bookname"   
  9.       android:layout_width="fill_parent"   
  10.       android:layout_height="wrap_content"   
  11.       >  
  12.       </EditText>  
  13.       <EditText    
  14.       android:id="@+id/author"   
  15.       android:layout_width="fill_parent"   
  16.       android:layout_height="wrap_content"   
  17.       >  
  18.       </EditText>  
  19.       <ListView   
  20.       android:id="@+id/bookslist"   
  21.       android:layout_width="fill_parent"   
  22.       android:layout_height="wrap_content"  
  23.       >  
  24.       </ListView>     
  25. </LinearLayout>  

第四步:修改SQLiteDatabaseDemo.java代码如下:

  1. package com.android.tutor;  
  2. import android.app.Activity;  
  3. import android.content.Context;  
  4. import android.database.Cursor;  
  5. import android.os.Bundle;  
  6. import android.view.Menu;  
  7. import android.view.MenuItem;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.AdapterView;  
  11. import android.widget.BaseAdapter;  
  12. import android.widget.EditText;  
  13. import android.widget.ListView;  
  14. import android.widget.TextView;  
  15. import android.widget.Toast;  
  16. public class SQLiteDatabaseDemo extends Activity implements AdapterView.OnItemClickListener {  
  17.     private BooksDB  mBooksDB;  
  18.     private Cursor   mCursor;  
  19.     private EditText BookName;  
  20.     private EditText BookAuthor;  
  21.     private ListView BooksList;  
  22.       
  23.     private int BOOK_ID = 0;  
  24.     protected final static int MENU_ADD = Menu.FIRST;  
  25.     protected final static int MENU_DELETE = Menu.FIRST + 1;  
  26.     protected final static int MENU_UPDATE = Menu.FIRST + 2;  
  27.       
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.         setUpViews();  
  32.     }  
  33.       
  34.     public void setUpViews(){  
  35.         mBooksDB = new BooksDB(this);  
  36.         mCursor  = mBooksDB.select();  
  37.           
  38.         BookName = (EditText)findViewById(R.id.bookname);  
  39.         BookAuthor = (EditText)findViewById(R.id.author);  
  40.         BooksList = (ListView)findViewById(R.id.bookslist);  
  41.           
  42.         BooksList.setAdapter(new BooksListAdapter(this, mCursor));  
  43.         BooksList.setOnItemClickListener(this);  
  44.     }  
  45.       
  46.     @Override  
  47.     public boolean onCreateOptionsMenu(Menu menu) {  
  48.         super.onCreateOptionsMenu(menu);  
  49.       
  50.         menu.add(Menu.NONE, MENU_ADD, 0, "ADD");  
  51.         menu.add(Menu.NONE, MENU_DELETE, 0, "DELETE");  
  52.         menu.add(Menu.NONE, MENU_DELETE, 0, "UPDATE");  
  53.         return true;  
  54.     }  
  55.       
  56.     public boolean onOptionsItemSelected(MenuItem item)  
  57.     {  
  58.       super.onOptionsItemSelected(item);  
  59.       switch (item.getItemId())  
  60.       {  
  61.         case MENU_ADD:  
  62.             add();  
  63.             break;  
  64.         case MENU_DELETE:  
  65.             delete();  
  66.             break;  
  67.         case MENU_UPDATE:  
  68.             update();  
  69.             break;  
  70.       }  
  71.       return true;  
  72.     }  
  73.       
  74.     public void add(){  
  75.         String bookname = BookName.getText().toString();  
  76.         String author  = BookAuthor.getText().toString();  
  77.         //书名和作者都不能为空,或者退出  
  78.         if (bookname.equals("") || author.equals("")){  
  79.             return;  
  80.         }  
  81.          mBooksDB.insert(bookname, author);  
  82.          mCursor.requery();  
  83.          BooksList.invalidateViews();  
  84.          BookName.setText("");  
  85.          BookAuthor.setText("");  
  86.          Toast.makeText(this, "Add Successed!", Toast.LENGTH_SHORT).show();  
  87.     }  
  88.       
  89.     public void delete(){  
  90.         if (BOOK_ID == 0) {  
  91.             return;  
  92.         }  
  93.         mBooksDB.delete(BOOK_ID);  
  94.         mCursor.requery();  
  95.         BooksList.invalidateViews();  
  96.         BookName.setText("");  
  97.         BookAuthor.setText("");  
  98.         Toast.makeText(this, "Delete Successed!", Toast.LENGTH_SHORT).show();  
  99.     }  
  100.       
  101.     public void update(){  
  102.         String bookname = BookName.getText().toString();  
  103.         String author  = BookAuthor.getText().toString();  
  104.         //书名和作者都不能为空,或者退出  
  105.         if (bookname.equals("") || author.equals("")){  
  106.             return;  
  107.         }  
  108.         mBooksDB.update(BOOK_ID, bookname, author);  
  109.         mCursor.requery();  
  110.         BooksList.invalidateViews();  
  111.         BookName.setText("");  
  112.         BookAuthor.setText("");  
  113.         Toast.makeText(this, "Update Successed!", Toast.LENGTH_SHORT).show();  
  114.     }  
  115.       
  116.     @Override  
  117.     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
  118.           
  119.         mCursor.moveToPosition(position);  
  120.         BOOK_ID = mCursor.getInt(0);      
  121.         BookName.setText(mCursor.getString(1));  
  122.         BookAuthor.setText(mCursor.getString(2));  
  123.           
  124.     }  
  125.       
  126.     public class BooksListAdapter extends BaseAdapter{  
  127.         private Context mContext;  
  128.         private Cursor mCursor;  
  129.         public BooksListAdapter(Context context,Cursor cursor) {  
  130.               
  131.             mContext = context;  
  132.             mCursor = cursor;  
  133.         }  
  134.         @Override  
  135.         public int getCount() {  
  136.             return mCursor.getCount();  
  137.         }  
  138.         @Override  
  139.         public Object getItem(int position) {  
  140.             return null;  
  141.         }  
  142.         @Override  
  143.         public long getItemId(int position) {  
  144.             return 0;  
  145.         }  
  146.         @Override  
  147.         public View getView(int position, View convertView, ViewGroup parent) {  
  148.             TextView mTextView = new TextView(mContext);  
  149.             mCursor.moveToPosition(position);  
  150.             mTextView.setText(mCursor.getString(1) + "___" + mCursor.getString(2));  
  151.             return mTextView;  
  152.         }  
  153.           
  154.     }  
  155. }  

第五步:运行程序效果如下:

 

 

 

   

 

第六步:查看我们所建的数据库。有两种方法:第一种用命令查看:adb shell ls data/data/com.android.tutor/databases。

另一种方法是用DDMS查看,在data/data下面对应的应用程序的包名 下会有如下数据库,如图所示:

 

 


SQLite实现增删改查 一:Sqlite简介 1.Sqlite是一种轻量级,零配置的,可嵌入的程序型的二进制文件,同时也是一种,关系型数据库。 2.数据库的创建是通过数据库的帮助类来实现,当用户要创建一个数据库就要定义一个帮助类,让其继承SqliteOpenHelper这个类,让后子类中实现一定的回调方法就可以创建数据了。 3.获取数据库实例 3.1:getWritableDatabase()方法; 3.2:getReadableDatabase()方法也可以,使用它时 如果数据库不存在,则先创建,再打开 如果数据库存在,但是版 阅读详情

相关推荐

Android 高手进阶教程(十三)之----Android 数据库SQLiteDatabase的使用!!

大家好,好久没有更新博客了,最近由于身体不适让大家久等了,好了,直接进入主题~Android 提供了三种数据方式,第一种是文件存储;第二种是SharedPreferences 存储;第三种就是数据库SQLiteDatabase 存储。文件存储我就不用多说了,而SharedPreferences 可以存取简单的数据(int,double,float.etc),它经常用于数据缓存,因为它读取存储简单。详细可以参见本系列。Android 高手进阶教程(七)之----Android 中Preferenc

Android_Tutor的专栏 2万+

Android 操作SQLite基本用法(SQLiteDatabase)

一、SQLite数据类型 一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型: NULL: 这个值为空值 VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。 CHAR(n):长度固定为n的字串,n不能超过 254。 INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3...

这个男孩不简单的博客 3万+

哈希拓展攻击CTF题做法

kali下载相关工具hash-ext-attack:hash拓展题目特征:2023楚慧杯upload_shell实验吧之让我进去:前言:具体怎么加密解密补位的原理我不懂,深入理解的部分我在文末挂了链接,以下也只是我做题的结论和通解,可能不准确(但是做题还挺准确),有错误欢迎指出:是在密码加密过程中引入的一个随机值,它与密码结合使用,目的是增加密码的复杂性和安全性。在密码加密中,常见的做法是将用户提供的密码进行哈希处理,然后存储哈希值而不是明文密码

2301_76690905的博客 2419

Android之SQLiteDatabase

文章目录一、SQLiteDatabase概念二、SQLiteDatabase对象的操作 一、SQLiteDatabase概念 用于管理和操作SQLite数据库,几乎所有的数据库操作,最终都将由这个类完成 getReadableDatabase() 返回的就是SQLiteDatabase SQLiteDatabase db=helper.getReadableDatabase(); 获取该类的对...

qq_39438055的博客 1491

Raptor码(一):2007RFC5053标准编解码学习

RFC 5053 标准

a_beatiful_knife的博客 3493

基于RK3588与FPGA的SDI视频处理系统:从MIPI CSI-2输入到DSI输出的全链路解析

本文深入解析了基于RK3588与FPGA的SDI视频处理系统全链路。系统利用FPGA作为高速接口转换与流管理核心,将SDI信号转换为MIPI CSI-2数据流送入RK3588进行智能图像处理与AI分析,处理结果再通过MIPI DSI回传,最终由FPGA控制编码为SDI输出,实现了专业视频接口与强大算力的高效协同。

s1t2u3的博客 667

在Android中SQLiteDatabase如何操作SQLite 数据库

SQLiteDatabase是 Android 中用于管理 SQLite 数据库的类,它提供了一组方法来执行数据库操作。

技术应让更广泛的人群流入到实际产品开发中才是正统 1102

4090显卡实测:PointPillars在KITTI数据集上的3D目标检测复现全流程(附避坑指南)

本文详细记录了在NVIDIA RTX 4090显卡上,从环境搭建、数据处理到模型训练与评估,完整复现PointPillars算法在KITTI数据集上进行3D目标检测的全流程。重点分享了版本配置、数据预处理、性能调优及常见问题的避坑指南,帮助开发者高效利用硬件资源,成功跑通并理解这一经典3D检测项目。

purple的博客 914

Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!

大家好,好久没有更新博客了,最近由于身体不适让大家久等了,好了,直接进入主题~ Android 提供了三种数据存储方式,第一种是文件存储;第二种是SharedPreferences存储;第三种就是数据库SQLiteDatabase存储。 文件存储我就不用多说了,而Shared

Peter_hucq的专栏 847

北斗导航 | 基于LSTM-KF融合的北斗卫星定位算法研究框架

针对北斗卫星导航系统在复杂环境下存在的多路径效应、非视距传播等问题,提出一种基于长短期记忆网络(LSTM)与卡尔曼滤波(KF)的组合定位算法。通过LSTM网络建模定位误差的非线性特征,结合卡尔曼滤波实现动态噪声抑制,构建"粗定位-LSTM校正-卡尔曼滤波优化"的三级处理架构。实验表明,融合算法较传统方法定位精度提升42.7%,均方根误差降低至1.2米。

尘世冰封的专栏 920

论文阅读:2024 ACM CCS “Do Anything Now”: Characterizing and Evaluating In-The-Wild Jailbreak Prompts on

大语言模型(LLMs)的滥用问题引起了公众和大语言模型供应商的高度关注。有一种特殊的对抗性提示,叫做越狱提示,它已成为绕过防护措施、让大语言模型生成有害内容的主要攻击手段。在这篇论文中,作者使用新框架JailbreakHub,对2022年12月至2023年12月期间的1405个越狱提示进行了全面分析。作者识别出131个越狱提示社区,发现了越狱提示的独特特征以及主要攻击策略,比如提示注入和权限提升。

CSPhD-winston的博客 1414

7-1.Android SQLite 之 SQLiteDatabase 简单编码模板(SQLiteDatabase 使用、SQL 语句编写)

SQLite 是一种轻量级的数据库引擎,它非常适合在移动设备(例如,Android)上使用。SQLiteDatabase 允许应用程序与 SQLite 数据库进行交互,它提供了增删改查等一系列方法

weixin_52173250的博客 1324

013 PID参数整定:Ziegler-Nichols法

几年前在调试一台伺服压机,客户要求位置精度±0.01mm,响应时间小于50ms。我按照教科书上的经验值设了P=1.5,I=0.02,D=0.01,结果电机一启动就开始尖叫,位置超调直接干到0.3mm,然后开始震荡,像极了喝醉的舞者。现场工程师看我的眼神,就像在看一个刚毕业的实习生。那次之后我明白了一个道理:PID参数不是靠猜的,也不是靠经验公式硬套的。你需要一个系统的方法,而Ziegler-Nichols法就是那个让你从“瞎调”走向“有章可循”的起点。

m0_50546716的博客 101
上一篇: Launcher为何物,究竟是干什么的?
下一篇: 通过Location获取Address的使用!
shareCode
博客等级 码龄15年 125粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值