安卓数据库(SQLite)专题

在安卓应用开发中,最常用的数据库是 SQLite。SQLite 是一种轻量级的关系型数据库管理系统,特别适用于移动设备和嵌入式系统。Android 提供了对 SQLite 数据库的支持,并且开发者可以使用 Android 提供的 SQLiteOpenHelper 类来管理数据库的创建、打开和升级。通过使用 SQLite,开发者可以在安卓应用中存储和管理数据。除了 SQLite 外,有时候也会使用其他数据库,如 Realm、Room(基于 SQLite 的对象映射库)、Firebase Realtime Database 或 Firestore 等,根据项目的需求和复杂度来选择合适的数据库技术。

填充数据的实验:

在安卓应用开发中,怎样往已有的SQLite数据库(该数据库有字段name, number, type, simid, 也已有Content Provider)中填充大量被拦截信息数据的(考虑使用预先准备的JSON 文件)?

1. 准备数据源
  • 创建一个 JSON 文件,包含要填充到数据库中的被拦截信息数据。这些数据应该包括字段 name, number, type, simid,与数据库表结构对应。

例如,一个被拦截信息的 JSON 数据可能如下所示:

[
  {
    "name": "John",
    "number": "1234567890",
    "type": "SMS",
    "simid": "SIM1"
  },
  {
    "name": "Alice",
    "number": "9876543210",
    "type": "Call",
    "simid": "SIM2"
  },
  // 更多信息...
]

2. 创建数据填充器类
  • 在你的 Android 项目中创建一个数据填充器类(比如 InterceptorDataSeeder),负责读取 JSON 数据源并将数据插入到 SQLite 数据库中。
3. 实现数据填充逻辑
  • InterceptorDataSeeder 类中实现逻辑,包括打开现有数据库连接、读取 JSON 数据源内容并将数据插入到数据库中的相应表格中。
4. 使用事务进行批量插入
  • 使用事务(Transaction)进行批量插入,以提高性能。
5. 调用数据填充器
  • 在适当的时机(例如应用启动时或首次使用时),调用 InterceptorDataSeeder 类的方法来触发数据填充操作。

示例代码:

public class InterceptorDataSeeder {
    private SQLiteDatabase mDatabase; // 引用已有的数据库

    public InterceptorDataSeeder(SQLiteDatabase database) {
        this.mDatabase = database;
    }

    public void seedInterceptedDataFromJSON(String jsonString) {
        try {
            JSONArray jsonArray = new JSONArray(jsonString);

            // 执行批量插入
            mDatabase.beginTransaction();
            try {
                // 将数据插入数据库表格
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    insertInterceptedDataIntoTable(jsonObject);
                }
                mDatabase.setTransactionSuccessful();
            } finally {
                mDatabase.endTransaction();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private void insertInterceptedDataIntoTable(JSONObject data) {
        try {
            // 从 JSON 对象中获取数据
            String name = data.getString("name");
            String number = data.getString("number");
            String type = data.getString("type");
            String simId = data.getString("simid");

            // 将数据插入到数据库表格中
            ContentValues values = new ContentValues();
            values.put("name", name);
            values.put("number", number);
            values.put("type", type);
            values.put("simid", simId);

            mDatabase.insert("InterceptedData", null, values); // 替换为你的表格名
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

使用示例:

MainActivityonCreate() 方法中调用 InterceptorDataSeeder 类的方法来触发数据填充操作,可以按照以下方式进行修改:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 假设已有一个名为 existingDatabase 的 SQLiteDatabase 对象
        String jsonContent = "YOUR_JSON_CONTENT_HERE"; // 用你的 JSON 数据填充这里

        InterceptorDataSeeder dataSeeder = new InterceptorDataSeeder(existingDatabase);
        dataSeeder.seedInterceptedDataFromJSON(jsonContent);
    }
}

MainActivityonCreate() 方法中,可以按照上述方式调用 InterceptorDataSeeder 类的 seedInterceptedDataFromJSON() 方法,用准备好的 JSON 数据填充数据库。记得替换 existingDatabase 为你的 SQLiteDatabase 对象,并将 jsonContent 替换为你的 JSON 数据内容。

String jsonContent = "YOUR_JSON_CONTENT_HERE"中的内容是一个json文件,怎样去调用该文件?

在 Android 开发中,要读取应用内的 JSON 文件,可以通过使用 Android 的资源管理器来获取文件内容。假设你的 JSON 文件放在 res/raw 文件夹中,可以按照以下步骤来读取 JSON 文件的内容并传递给 InterceptorDataSeeder 类:

步骤:

1. 将 JSON 文件放入 res/raw 目录中
  • 将你的 JSON 文件(假设为 example.json)放入 res/raw 目录下。如果没有 raw 文件夹,可以手动创建。
2. 读取 JSON 文件内容并传递给 InterceptorDataSeeder
  • MainActivity 中使用资源管理器读取 JSON 文件内容,并传递给 InterceptorDataSeeder 类。

示例代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 读取 JSON 文件内容
        String jsonContent = readJSONFromRawResource(R.raw.example);

        // 假设已有一个名为 existingDatabase 的 SQLiteDatabase 对象
        InterceptorDataSeeder dataSeeder = new InterceptorDataSeeder(existingDatabase);
        dataSeeder.seedInterceptedDataFromJSON(jsonContent);
    }

    private String readJSONFromRawResource(int resourceId) {
        Resources resources = getResources();
        InputStream inputStream = resources.openRawResource(resourceId);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder stringBuilder = new StringBuilder();

        String line;
        try {
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return stringBuilder.toString();
    }
}

在上述代码中,readJSONFromRawResource() 方法用于从 res/raw 目录下的指定资源 ID 的文件中读取内容并返回为字符串。在 onCreate() 方法中调用 readJSONFromRawResource() 方法,将读取到的 JSON 内容传递给 InterceptorDataSeeder 类的 seedInterceptedDataFromJSON() 方法。请将 R.raw.example 替换为你实际的 JSON 文件资源 ID。

这样做可以在应用启动时自动填充数据库。

另外,也可在代码中硬编码数据来进行填充:

步骤:

1. 创建数据填充器类
  • 在你的 Android 项目中创建一个数据填充器类(比如 DataFiller),用于填充数据到数据库中。
2. 实现数据填充逻辑
  • DataFiller 类中实现逻辑,包括打开现有数据库连接、准备要插入的大量数据,并将数据插入到数据库中的相应表格中。
3. 使用事务进行批量插入
  • 在插入大量数据时,推荐使用事务(Transaction)进行批量插入,以提高性能。通过使用事务,可以将多个插入操作作为一个原子操作执行,避免频繁地提交数据库事务。
4. 调用数据填充器
  • 在适当的时机(例如应用启动时或首次使用时),调用 DataFiller 类的方法来触发数据填充操作。

示例代码:

下面是一个简化的示例,展示了如何在 Android 应用中直接使用硬编码的数据填充数据库:

public class DataFiller {
    private SQLiteDatabase mDatabase; // 引用已有的数据库

    public DataFiller(SQLiteDatabase database) {
        this.mDatabase = database;
    }

    public void fillDataIntoTable() {
        mDatabase.beginTransaction();
        try {
            // 准备要插入的大量数据
            insertInterceptedDataIntoTable("John", "1234567890", "SMS", "SIM1");
            insertInterceptedDataIntoTable("Alice", "9876543210", "Call", "SIM2");
            // 插入更多数据...

            mDatabase.setTransactionSuccessful();
        } finally {
            mDatabase.endTransaction();
        }
    }

    private void insertInterceptedDataIntoTable(String name, String number, String type, String simId) {
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("number", number);
        values.put("type", type);
        values.put("simid", simId);

        mDatabase.insert("smslog", null, values); // 替换为你的表名
    }
}

在这个示例中,DataFiller 类的 fillDataIntoTable() 方法用于填充数据库表格。通过调用 insertInterceptedDataIntoTable() 方法,硬编码了一些示例数据,并将其插入到名为 smslog 的数据库表中。

MainActivity 中的使用示例:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 假设已有一个名为 existingDatabase 的 SQLiteDatabase 对象
        DataFiller dataFiller = new DataFiller(existingDatabase);
        dataFiller.fillDataIntoTable();
    }
}

这种方法将直接在代码中写入数据,并使用事务进行批量插入,无需使用 JSON 文件。你只需在 insertInterceptedDataIntoTable() 方法中提供要插入的数据,并在适当的时机调用 DataFiller 类的方法即可完成数据填充。

还有一种填充数据的方式:

//黑名单:
        for (int i = 0; i < 5; i++) {
            int random = (int)((Math.random()*9+1)*100000);

            Contact contact = new Contact();
            contact.name = "abc";
            contact.phonenum = "2" + random;
            if (i > 0 && i <= 2) {
                contact.name = "abc";
                contact.phonenum = null;
            }
            contact.simid = 0;
            contact.type = 0;
            ContentValues contentValues = ContactUtil.generateContentValues(contact);
            DBHelper.getInstance().insert(DBHelper.HEIMINGDAN, contentValues); //或者
            // DaoCreator.createContactDao().insert(contact);
        }

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yifei Li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值