Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)

简介:
  • 知识点:

    1.使用SQL Helper创建数据库

           2.数据的增删查改(PRDU:Put、Read、Delete、Update)

  • 背景知识:

                 上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中。相信大家对数据库都不陌生。对于

                            大量重复的,有特定结构

            数据的保存,用 SQL数据库 来保存是最理想不过了。

            下面将用一个关于联系人的数据库Demo来具体学习。

  • 具体知识:

             1.定义Contract类

               在创建SQL数据库之前,要创建Contract类。那什么是Contract类呢?

 

            

复制代码
Contract Class的定义:
    Contract Class,又可以叫做Companion Class。
    Android Developer的帮助文档是这么说的:
   < A contract class is a container for constants that define names for URIs, 
tables, and columns. The contract class allows you to use the same constants
across all the other classes in the same package. This lets you change a
column name in one place and have it propagate throughout your code.> Contact 类是定义URI、表、列的名字的容器。这个类允许我们在同一包的不同类下使用相同的常量。
我们在一处修改了列名,同时传播到我们代码的每个地方。
复制代码

         

复制代码
 1 package com.example.sqlitetest;
 2 //Contract类
 3 public class Contact {
 4     
 5     int _id;
 6     String _name;
 7     String _phone_number;
 8     
 9     public Contact(){
10         
11     }
12     public Contact(int id, String name, String _phone_number){
13         this._id = id;
14         this._name = name;
15         this._phone_number = _phone_number;
16     }
17     
18     public Contact(String name, String _phone_number){
19         this._name = name;
20         this._phone_number = _phone_number;
21     }
22     public int getID(){
23         return this._id;
24     }
25     
26     public void setID(int id){
27         this._id = id;
28     }
29     
30     public String getName(){
31         return this._name;
32     }
33     
34     public void setName(String name){
35         this._name = name;
36     }
37     
38     public String getPhoneNumber(){
39         return this._phone_number;
40     }
41 
42     public void setPhoneNumber(String phone_number){
43         this._phone_number = phone_number;
44     }
45 }
复制代码

 

 

         2.使用SQLHelper创建数据库

          就像保存文件在内部存储一样,Android在私有的应用存储空间存储我们的数据库,这样就保证我们的数据是安全的。不能被其他应用访问到。

       

在设备上存储的数据库保存在:
             /data/data/<package_name>/databases目录下

 

          

           

   为了使用SQLiteOpenHelper,我们需要创建一个重写了onCreate(),onUpgrade()和onOpen()回调方法的子类。

     3.数据的增删改查

        增:传ContentValue值到insert()方法。

       

复制代码
SQLiteDatabase db = this.getWritableDatabase();
 
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName());
values.put(KEY_PH_NO, contact.getPhoneNumber()); 
  
db.insert(TABLE_CONTACTS, null, values);
db.close(); 
复制代码

     

        删:delete()方法

SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
        new String[] { String.valueOf(contact.getID()) });
db.close();

       

       改:update()方法

复制代码
SQLiteDatabase db = this.getWritableDatabase();

ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName());
values.put(KEY_PH_NO, contact.getPhoneNumber());


return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
          ew String[] { String.valueOf(contact.getID()) });
复制代码

 

     查:query()方法

复制代码
SQLiteDatabase db = this.getReadableDatabase();

Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
                new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();

Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
                cursor.getString(1), cursor.getString(2));

return contact;
复制代码

 

完整DatabaseHelper代码如下:

复制代码
  1 package com.example.sqlitetest;
  2 
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 
  6 import android.content.ContentValues;
  7 import android.content.Context;
  8 import android.database.Cursor;
  9 import android.database.sqlite.SQLiteDatabase;
 10 import android.database.sqlite.SQLiteOpenHelper;
 11 
 12 public class DatabaseHelper extends SQLiteOpenHelper {
 13 
 14     // 数据库版本
 15     private static final int DATABASE_VERSION = 1;
 16 
 17     // 数据库名
 18     private static final String DATABASE_NAME = "contactsManager";
 19 
 20     //Contact表名
 21     private static final String TABLE_CONTACTS = "contacts";
 22 
 23     //Contact表的列名
 24     private static final String KEY_ID = "id";
 25     private static final String KEY_NAME = "name";
 26     private static final String KEY_PH_NO = "phone_number";
 27 
 28     public DatabaseHelper(Context context) {
 29         super(context, DATABASE_NAME, null, DATABASE_VERSION);
 30     }
 31 
 32     // 创建表
 33     @Override
 34     public void onCreate(SQLiteDatabase db) {
 35         String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
 36                 + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
 37                 + KEY_PH_NO + " TEXT" + ")";
 38         db.execSQL(CREATE_CONTACTS_TABLE);
 39     }
 40 
 41     // 更新表
 42     @Override
 43     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 44         // 删除旧表
 45         db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
 46 
 47         //再次创建表
 48         onCreate(db);
 49     }
 50 
 51     /**
 52      *增删改查操作
 53      */
 54 
 55     // 增加新的联系人
 56     void addContact(Contact contact) {
 57         SQLiteDatabase db = this.getWritableDatabase();
 58 
 59         ContentValues values = new ContentValues();
 60         values.put(KEY_NAME, contact.getName());
 61         values.put(KEY_PH_NO, contact.getPhoneNumber());
 62 
 63         // 插入行
 64         db.insert(TABLE_CONTACTS, null, values);
 65         db.close(); // 关闭数据库的连接
 66     }
 67 
 68     // 获取联系人
 69     Contact getContact(int id) {
 70         SQLiteDatabase db = this.getReadableDatabase();
 71 
 72         Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
 73                 KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
 74                 new String[] { String.valueOf(id) }, null, null, null, null);
 75         if (cursor != null)
 76             cursor.moveToFirst();
 77 
 78         Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
 79                 cursor.getString(1), cursor.getString(2));
 80         return contact;
 81     }
 82     
 83     // 获取所有联系人
 84     public List<Contact> getAllContacts() {
 85         List<Contact> contactList = new ArrayList<Contact>();
 86         // Select All Query
 87         String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
 88 
 89         SQLiteDatabase db = this.getWritableDatabase();
 90         Cursor cursor = db.rawQuery(selectQuery, null);
 91 
 92         if (cursor.moveToFirst()) {
 93             do {
 94                 Contact contact = new Contact();
 95                 contact.setID(Integer.parseInt(cursor.getString(0)));
 96                 contact.setName(cursor.getString(1));
 97                 contact.setPhoneNumber(cursor.getString(2));
 98                 contactList.add(contact);
 99             } while (cursor.moveToNext());
100         }
101 
102         return contactList;
103     }
104 
105     // 更新单个联系人
106     public int updateContact(Contact contact) {
107         SQLiteDatabase db = this.getWritableDatabase();
108 
109         ContentValues values = new ContentValues();
110         values.put(KEY_NAME, contact.getName());
111         values.put(KEY_PH_NO, contact.getPhoneNumber());
112 
113         //更新行
114         return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
115                 new String[] { String.valueOf(contact.getID()) });
116     }
117 
118     // 删除单个联系人
119     public void deleteContact(Contact contact) {
120         SQLiteDatabase db = this.getWritableDatabase();
121         db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
122                 new String[] { String.valueOf(contact.getID()) });
123         db.close();
124     }
125 
126 
127     // 获取联系人数量
128     public int getContactsCount() {
129         String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
130         SQLiteDatabase db = this.getReadableDatabase();
131         Cursor cursor = db.rawQuery(countQuery, null);
132         cursor.close();
133 
134         return cursor.getCount();
135     }
136 }
复制代码

 还有一些代码不是本次学习的重点,就不贴出来了。有需要的留言找我要。

 Demo运行效果图:

       

 

 

       

   

 

     

原文地址:http://www.cnblogs.com/JohnTsai/p/4013196.html
相关文章
|
7天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
47 10
|
19天前
|
SQL 存储 关系型数据库
一文搞懂SQL优化——如何高效添加数据
**SQL优化关键点:** 1. **批量插入**提高效率,一次性建议不超过500条。 2. **手动事务**减少开销,多条插入语句用一个事务。 3. **主键顺序插入**避免页分裂,提升性能。 4. **使用`LOAD DATA INFILE`**大批量导入快速。 5. **避免主键乱序**,减少不必要的磁盘操作。 6. **选择合适主键类型**,避免UUID或长主键导致的性能问题。 7. **避免主键修改**,保持索引稳定。 这些技巧能优化数据库操作,提升系统性能。
215 4
一文搞懂SQL优化——如何高效添加数据
|
25天前
|
SQL 存储 BI
【软件设计师备考 专题 】数据库语言(SQL)
【软件设计师备考 专题 】数据库语言(SQL)
89 0
|
25天前
|
存储 Oracle 关系型数据库
Dataphin常见问题之想要周期执行任务如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
17天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
16 0
|
7天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
66 6
|
2天前
|
SQL 关系型数据库 MySQL
关系型数据库插入数据的语句
使用SQL的`INSERT INTO`语句向关系型数据库的`students`表插入数据。例如,插入一个`id`为1,`name`为&#39;张三&#39;,`age`为20的记录:`INSERT INTO students (id, name, age) VALUES (1, &#39;张三&#39;, 20)。如果`id`自增,则可简化为`INSERT INTO students (name, age) VALUES (&#39;张三&#39;, 20)`。
5 2
|
2天前
|
SQL 存储 Oracle
关系型数据库查询数据的语句
本文介绍了关系型数据库中的基本SQL查询语句,包括选择所有或特定列、带条件查询、排序、分组、过滤分组、表连接、限制记录数及子查询。SQL还支持窗口函数、存储过程等高级功能,是高效管理数据库的关键。建议深入学习SQL及相应数据库系统文档。
6 2
|
4天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
4天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
32 3