Android中SQLite数据库存储

本文介绍了在Android中为何使用SQLite进行数据持久化,强调了SQLite数据库轻量级且支持标准SQL的特点。通过阐述数据库的读写权限配置、数据库助手类、实体类以及操作类的创建,展示了如何在Android中简便地使用SQLite数据库。此外,文章还提及了Android为不熟悉SQL的开发者提供的封装选项,使得数据库操作更为简单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为啥要用SQLite存储

如果不使用存储,重启手机会导致数据丢失,这就是临时数据,当时数据保存在内存中,关机之后内存释放,数据丢失。如果不想数据丢失,需要使用数据持久化技术。常见的有SharePreference、数据库存储、SD卡存储、IO流。这里我只说用数据库存储,SharePerference虽说好用,但是不适合存储一些数据量比较大的数据。像这种”累活”还是交给数据库比较好

SQLite数据库有啥特点

这里我只想说,如果你玩过服务端,对于数据库中的SQL语句一定是了如指掌,使用的游刃有余。Android中的数据库也支持标准的SQL语句。不过Android数据库向服务端的那种数据库比起来就显得格外的轻量级了,你也不需要安装数据库软件。

Android中SQLite数据库的使用

因为操作数据库肯定是要读取和写入的,所以要配置一下读写权限

<!--手机中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--手机中创建/删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>

数据库的创建删除以及更新的助手类

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * 数据库建库建表类
 * @author LiLei
 */
public class MySQLiteOpenHelper extends SQLiteOpenHelper
{
    // 数据库名称
    public static final String DBNAME = "android.db";

    // 数据库版本
    public static final int VERSION = 2;

    // 建表语句,大小写不敏感(只要你大小写不混着写,就不算过分...)
    private static final String CREATETABLE =
                    "create table " + Message.TABLE_NAME
                    +"("
                        + "id string,"
                        + "title string,"
                        + "url string"
                    +")";

    /**
     * 通过构造函数创建数据库
     *      context 上下文
     *      DNNAME 数据库的名称
     *      null 游标
     *      VERSION 版本
     */
    public MySQLiteOpenHelper(Context context) {
        super(context, DBNAME, null, VERSION);
    }

    // 创建表
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATETABLE);
    }

    // 更新表
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        this.deleteDB(db);
        this.onCreate(db);
    }

    // 删除表
    private void deleteDB(SQLiteDatabase db) {
        db.execSQL("drop table if exists " + Message.TABLE_NAME);
    }
}

还需要创建一个实体类,用于方便管理数据和集合的操作
这代码就不写了,自己弄一下吧

public static final String TABLENAME = 
private int id 
private String 
private String 

get 和 set 方法

数据库和表都有了,还需要对表增删改查的功能,所以还要创建一个类,对其操作

/**
 * 数据库管理类(CRUD)
 * @author LiLei
 */
public class DatabaseManager {

    private MySQLiteOpenHelper dbHelper;

    public DatabaseManager()
    {
        //这里利用MyApplication类获取MySQLiteOpenHelper对象,下面是MyApplication的代码,别忘了在在AndroidManifest配置一下name
        /*
            private static MySQLiteOpenHelper helper;
            @Override
            public void onCreate() 
            {
                super.onCreate();
                helper = new MySQLiteOpenHelper(MyApplication.this);
            }

            public static MySQLiteOpenHelper getSQLiteOpenHelper()
            {
                return helper;
            }

        */
        dbHelper = MyApplication.getHelper();
    }

    /**
     * 增
     * @param m
     * @return
     */
    public int insert(Message m)
    {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.beginTransaction();
        try
        {
            db.execSQL("insert into " + m.TABLE_NAME + " values(?,?,?)", new Object[] { m.id,m.title,m.url});
            db.setTransactionSuccessful();
        }
        catch (Exception e)
        {
            return 0;
        }
        finally
        {
            db.endTransaction();
        }
        db.close();
        return 1;
    }

    /**
     * 删
     * @param m
     * @return
     */
    public int delete(Message m) {

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.beginTransaction();
        try {
            db.execSQL("delete from " + m.TABLE_NAME + " where id = ?",new Object[] { m.id});
            db.setTransactionSuccessful();
        } catch (Exception e) {
            return 0;
        } finally {
            db.endTransaction();
        }
        db.close();
        return 1;
    }

    /**
     * 改
     * @param m
     * @return
     */
    public int update(Message m) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.beginTransaction();
        try {
            db.execSQL("update " + m.TABLE_NAME
                    + " set title=?, url=? where id=?", new Object[] {
                    m.title, m.url, m.id });
            db.setTransactionSuccessful();
        } catch (Exception e) {
            return 0;
        } finally {
            db.endTransaction();
        }
        db.close();
        return 1;
    }

   /**
    * 查
    * 如果不传递参数,代表查询所有
    * 传递参数,代表查询表中得ID等于当前ID的数据,没查到就返回null
    * 
    * @param url  这里的url就是ID,如果你看不惯你就改一下吧!
    * @return
    */
    public ArrayList<Message> query(String url)
    {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor;
        Message message;
        ArrayList<Message> list = new ArrayList<Message>();
        // 若url为null或""则返回所有数据
        if (url == null || url.equals("")) {
            cursor = db.rawQuery("select * from " + Message.TABLE_NAME, null);
        } else {
            cursor = db.rawQuery("select * from " + Message.TABLE_NAME + " where url=?", new String[] { url });
        }
        while (cursor.moveToNext()) {
            message = new Message();
            message.id = cursor.getInt(cursor.getColumnIndex("id"));
            message.title = cursor.getString(cursor.getColumnIndex("title"));
            message.url = cursor.getString(cursor.getColumnIndex("url"));
            list.add(message);
        }
        cursor.close();
        db.close();
        if (list.size() == 0) 
        {
            return null;
        }
        return list;
    }
}

这三个类都写完了,直接就可以用了
用的话也是很简单了,直接在MainActivity中

//创建数据库和获取数据库管理对象
DatabaseManager databaseManager = new DatabaseManager();

//增  删  改  查
databaseManager.insert(JavaBean对象);

//查询
List<JavaBean对象> messageList = databaseManager.query(传ID或者不传递);

SQLite数据库使用是非常easy的。不过Android考虑的非常周全,就怕你不会SQL语句,也为你封装了一下,使用更简便。你用的话随意,用哪种
都可以,我还是比较喜欢直接用SQL写

//增
ContentValues values = new ContentValues();
values.put( "username",username);
values.put( "password",password);
db.insert( "login", "username" , values);

//删
db.delete( "login", "username=?" ,new String[]{"wangcai"});

//改               
ContentValues values2 = new ContentValues();
values2.put( "password", "123" );
db.update( "login", values, "username=?" ,new String[]{username});

//查
Cursor cursor = db.query( "login", new String[]{"username", "password"}, "username=?", new String[]{username}, null, null, null);
if(cursor.moveToFirst())
{
     do
     {
      String userName = cursor.getString(0);
      String passWord = cursor.getColumnName(cursor.getColumnIndex( "password"));
     }
     while(cursor.moveToNext());
 }

这东西就是一点技术含量都没有,看一遍就会了。剩下的就是开发中的实际应用了,还有很多函数这里没有用到,要是感兴趣的话可以到处逛逛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值