Android SQLite详解及示例代码

Android SQLite详解及示例代码

什么是Android SQLite

SQLite是一个轻型的数据库库,它存储在设备的内部存储上,并提供了一些SQL接口用于读写数据。在Android开发中,SQLite是非常重要的一部分,它被广泛应用于Android应用的本地数据存储。

如何使用Android SQLite

1. 创建一个SQLite数据库

第一步是创建一个SQLite数据库。创建SQLite数据库的方法非常简单,只需继承SQLiteOpenHelper类并实现其中的onCreate()onUpgrade()方法即可。

public class MyDatabase extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "my_database.db";
    private static final int DATABASE_VERSION = 1;

    public MyDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS my_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS my_table");
        onCreate(db);
    }
}

onCreate()方法中,我们定义了一个名为my_table的表,并定义了三个字段:_idnameage。其中_id字段定义为自增主键,在每次插入新数据的时候会自动递增。

onUpgrade()方法中,我们实现了数据库的升级逻辑,当DATABASE_VERSION升级时,会被调用这个方法,我们可以在这里删除、修改或添加表和字段,以及进行其他的操作。

2. 插入数据

第二步是插入数据。在Android SQLite中插入数据非常简单,我们可以使用SQLiteDatabase中的insert()方法插入数据。

SQLiteDatabase db = myDatabase.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", "John");
cv.put("age", 25);
long rowId = db.insert("my_table", null, cv);
db.close();

在这个示例中,我们创建了一个ContentValues对象,用于存放要插入数据库的数据。然后调用insert()方法将数据插入到my_table表中。最后,我们需要关闭数据库连接,以避免内存泄漏。

3. 查询数据

第三步是查询数据。在Android SQLite中查询数据也非常简单,我们使用SQLiteDatabase中的rawQuery()方法查询数据。

SQLiteDatabase db = myDatabase.getWritableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM my_table", null);
while (cursor.moveToNext()) {
    int id = cursor.getInt(cursor.getColumnIndex("_id"));
    String name = cursor.getString(cursor.getColumnIndex("name"));
    int age = cursor.getInt(cursor.getColumnIndex("age"));
    Log.d("MyDatabase", "id: " + id + ", name: " + name + ", age: " + age);
}
cursor.close();
db.close();

在这个示例中,我们查询了my_table表中的所有数据,并使用Cursor对象遍历结果集。在每次循环中,我们获取了数据集中的三个字段:_idnameage,然后打印到了日志中。

示例说明

示例一:使用SQLite数据库存储用户信息

在这个示例中,我们使用SQLite数据库存储用户信息。当用户在应用中输入用户名和密码时,将数据插入到SQLite数据库中,在用户下次登录时,从SQLite数据库中查询用户信息以验证用户身份。

public class UserDatabase extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "user_database.db";
    private static final int DATABASE_VERSION = 1;

    public UserDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS user_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS user_table");
        onCreate(db);
    }

    public void addUser(String username, String password) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("username", username);
        cv.put("password", password);
        db.insert("user_table", null, cv);
        db.close();
    }

    public boolean verifyUser(String username, String password) {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM user_table WHERE username=? AND password=?", new String[]{username, password});
        int count = cursor.getCount();
        cursor.close();
        db.close();
        return count > 0;
    }
}

在这个示例中,我们定义了一个UserDatabase类,用于存储用户信息。在onCreate()方法中,我们定义了一个名为user_table的表,并定义了三个字段:_idusernamepassword。在addUser()方法中,我们使用insert()方法将用户信息插入到user_table表中。在verifyUser()方法中,我们使用rawQuery()方法从user_table表中查询用户名和密码是否匹配。如果匹配成功,则返回true,否则返回false

示例二:使用SQLite数据库存储任务清单

在这个示例中,我们使用SQLite数据库存储任务清单。用户可以在应用中添加、删除和修改任务,并在应用中查看任务列表。当用户退出应用后,任务清单数据将保存在SQLite数据库中,并在下次打开应用时加载。

public class TaskDatabase extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "task_database.db";
    private static final int DATABASE_VERSION = 1;

    public TaskDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS task_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, description TEXT, date TEXT)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS task_table");
        onCreate(db);
    }

    public void addTask(String name, String description, String date) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("name", name);
        cv.put("description", description);
        cv.put("date", date);
        db.insert("task_table", null, cv);
        db.close();
    }

    public void deleteTask(int id) {
        SQLiteDatabase db = getWritableDatabase();
        db.delete("task_table", "_id=?", new String[]{String.valueOf(id)});
        db.close();
    }

    public void updateTask(int id, String name, String description, String date) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put("name", name);
        cv.put("description", description);
        cv.put("date", date);
        db.update("task_table", cv, "_id=?", new String[]{String.valueOf(id)});
        db.close();
    }

    public List<Task> getAllTasks() {
        SQLiteDatabase db = getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM task_table", null);
        List<Task> tasks = new ArrayList<>();
        while (cursor.moveToNext()) {
            int id = cursor.getInt(cursor.getColumnIndex("_id"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String description = cursor.getString(cursor.getColumnIndex("description"));
            String date = cursor.getString(cursor.getColumnIndex("date"));
            Task task = new Task(id, name, description, date);
            tasks.add(task);
        }
        cursor.close();
        db.close();
        return tasks;
    }
}

在这个示例中,我们定义了一个TaskDatabase类,用于存储任务清单信息。在onCreate()方法中,我们定义了一个名为task_table的表,并定义了四个字段:_idnamedescriptiondate。在addTask()方法中,我们使用insert()方法将任务信息插入到task_table表中。在deleteTask()方法中,我们使用delete()方法删除任务清单中的某一条任务。在updateTask()方法中,我们使用update()方法修改任务清单中的某一条任务。在getAllTasks()方法中,我们使用rawQuery()方法查询task_table表中的所有任务,并返回一个任务列表。在任务列表中,每个任务包括idnamedescriptiondate四个字段。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android SQLite详解及示例代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言中static的使用方法实例详解

    C语言中static的使用方法实例详解 介绍 static是C语言中的一个关键字,可以用来修饰变量、函数、和数据结构。在不同的情境下,static有不同的用途和行为。本文将对static关键字的使用方法进行详细讲解,并提供两个具体的使用示例。 修饰变量 在函数内部使用 当static修饰局部变量的时候,变量的生命周期不会随着函数的调用结束而结束,而是会在程序…

    C 2023年5月23日
    00
  • C++实现AVL树的完整代码

    实现AVL树的完整代码需要遵循以下步骤: 第一步:头文件声明 在代码文件的开头,我们需要声明头文件,以引入所需的库和类。在实现AVL树的完整代码中,我们需要添加以下头文件: #include <iostream> #include <algorithm> 这里用到了C++标准库中的iostream库,用于输入输出操作,以及algori…

    C 2023年5月24日
    00
  • asp.net下将纯真IP数据导入数据库中的代码

    下面是详细讲解“asp.net下将纯真IP数据导入数据库中的代码”的完整攻略: 前置要求 在开始编写代码之前需先准备好以下内容: 纯真IP数据库,可以到官网下载; Visual Studio开发环境; SQL Server数据库。 导入纯真IP数据库 下载纯真IP数据库,并将其解压到本地硬盘; 在SQL Server中创建一个新的数据库,例如命名为ipdb;…

    C 2023年5月23日
    00
  • 详解利用C语言如何实现简单的内存池

    利用C语言实现简单的内存池一般可以分为以下步骤: 步骤一:自定义内存池数据结构 首先,我们需要自定义一个内存池的数据结构,一般包含以下几个要素: 内存池的大小(即可分配的内存总大小) 内存块的大小(即每个可分配的内存块的大小) 空闲内存块的数量(即尚未被分配的内存块的数量) 内存块的首地址(即内存池的起始地址) 我们可以使用结构体来表示这些要素,例如: st…

    C 2023年5月23日
    00
  • C++中新手容易犯的十种编程错误汇总

    C++中新手容易犯的十种编程错误汇总 作为一种流行的编程语言,C++在实际应用中被广泛使用,然而,对于初学者来说,C++的语法结构、编程范式以及一些细节问题容易让他们犯错。 下面列出了C++中新手容易犯的十种编程错误并提供了攻略,供初学者参考: 1. 没有包含必要的头文件 C++中有大量的头文件,而这些头文件中定义了许多有用的函数和变量。如果没有包含必要的头…

    C 2023年5月22日
    00
  • C++类与对象的详细说明

    C++是一种面向对象的编程语言,其中最重要的概念就是类和对象。类定义了一个对象的特征和行为,而对象则是类的一个实例。 类的定义 在C++中,定义一个类需要使用class关键字,接着是类的名称和一对花括号,其中花括号内的代码称为类体,它包含了类的成员变量和成员函数。 class MyClass { public: // 公有成员函数 void DoSometh…

    C 2023年5月22日
    00
  • C语言 动态内存分配的详解及实例

    C语言 动态内存分配的详解及示例 什么是动态内存分配 在编程中,有时我们需要根据实际情况动态地分配内存空间,而不是在编写时就预先分配好。这种内存分配方式被称为动态内存分配。动态内存分配可以避免预分配内存的浪费,同时还可以根据需要扩充内存。 C语言中提供了四个用于动态内存分配的库函数,分别是 malloc、calloc、realloc 和 free。 mall…

    C 2023年5月23日
    00
  • 详细分析C++ 信号处理

    详细分析C++信号处理 什么是信号处理? 信号处理是一种处理外部事件的方法。在Linux环境下,当一个进程接收到某种事件信号时,操作系统会发送一个信号给该进程。通过信号处理函数,进程可以对该信号进行处理。 如何在C++中进行信号处理? 在C++中,可以通过POSIX标准的signal()函数来设置信号处理函数。以下是使用signal()函数的代码示例: #i…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部