在安卓应用开发中,最常用的数据库是 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();
}
}
}
使用示例:
在 MainActivity
的 onCreate()
方法中调用 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);
}
}
在 MainActivity
的 onCreate()
方法中,可以按照上述方式调用 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);
}