Android端Realm数据库如何导出为CSV/JSON?是否有内置方法?
Great question! Unlike iOS, Realm for Android doesn’t come with a built-in method to directly export your database to CSV or JSON. But don’t worry—you can easily build this functionality yourself with a bit of custom code. Let’s break down how to handle both formats:
Exporting to CSV
Realm doesn’t have a native CSV exporter, but you can loop through your Realm objects, extract their field values, and format them into comma-separated lines. Just remember to handle values that contain commas by wrapping them in quotes!
Example Implementation
Suppose you have a simple User Realm model:
public class User extends RealmObject { @PrimaryKey private String id; private String name; private int age; private String email; // Getters and setters }
Here’s a reusable method to export any Realm model to CSV:
public void exportRealmToCSV(Realm realm, Class<?> realmClass, String filePath) throws IOException { RealmResults<?> results = realm.where(realmClass).findAll(); // Collect field names (skip Realm's internal proxy fields) Field[] fields = realmClass.getDeclaredFields(); List<String> fieldNames = new ArrayList<>(); for (Field field : fields) { if (!field.getName().equals("realm$proxyState") && !field.getName().equals("realm")) { field.setAccessible(true); fieldNames.add(field.getName()); } } BufferedWriter writer = new BufferedWriter(new FileWriter(filePath)); // Write header row writer.write(String.join(",", fieldNames)); writer.newLine(); // Write data rows for (Object obj : results) { List<String> values = new ArrayList<>(); for (Field field : fields) { if (!field.getName().equals("realm$proxyState") && !field.getName().equals("realm")) { try { Object value = field.get(obj); String valueStr = value != null ? value.toString() : ""; // Wrap values with commas in double quotes if (valueStr.contains(",")) { valueStr = "\"" + valueStr + "\""; } values.add(valueStr); } catch (IllegalAccessException e) { e.printStackTrace(); values.add(""); } } } writer.write(String.join(",", values)); writer.newLine(); } writer.close(); }
How to Call It
// Export to app-specific storage (no permissions needed on Android 10+) String csvPath = getExternalFilesDir(null) + "/users.csv"; exportRealmToCSV(realm, User.class, csvPath);
Exporting to JSON
This one’s simpler—Realm for Android has a built-in toJson() method for both RealmObject and RealmResults that converts objects directly to JSON strings.
Example Implementation
public void exportRealmToJSON(Realm realm, Class<?> realmClass, String filePath) throws IOException { RealmResults<?> results = realm.where(realmClass).findAll(); // Get JSON array string directly from RealmResults String json = results.toJson(); BufferedWriter writer = new BufferedWriter(new FileWriter(filePath)); writer.write(json); writer.close(); }
Notes on JSON Export
- If you need to modify the data before exporting (e.g., exclude certain fields), convert Realm objects to plain Java objects first with
realm.copyFromRealm(results), then serialize that list to JSON using a library like Gson. toJson()automatically handles nested Realm objects and lists, so complex models will export correctly without extra work.
Key Considerations
- Permissions: On Android 6.0+, you’ll need the
WRITE_EXTERNAL_STORAGEpermission if exporting to public storage. For app-specific storage (used in the examples), no permissions are required. - Complex Models: For CSV exports with nested relationships, you’ll need to adjust the code to flatten nested fields or write related data to separate CSV files.
内容的提问来源于stack exchange,提问作者Nishant Tanwar

