diff --git a/SettingsPage.tsx b/SettingsPage.tsx
index 1af9121..ef8382f 100644
--- a/SettingsPage.tsx
+++ b/SettingsPage.tsx
@@ -538,6 +538,26 @@ export default function SettingsPage() {
),
},
+ {
+ name: "Export sets as CSV",
+ renderItem: (name: string) => (
+
+ ),
+ },
{
name: "Import database",
renderItem: (name: string) => (
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 7e76c41..8f74af6 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -85,8 +85,8 @@ android {
applicationId "com.massive"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 36220
- versionName "2.5"
+ versionCode 36221
+ versionName "2.6"
}
signingConfigs {
release {
@@ -125,6 +125,7 @@ dependencies {
implementation("com.facebook.react:react-android")
implementation 'androidx.documentfile:documentfile:1.0.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
+ implementation 'com.opencsv:opencsv:5.5.2'
implementation project(':react-native-sqlite-storage')
implementation project(':react-native-vector-icons')
diff --git a/android/app/src/main/java/com/massive/BackupModule.kt b/android/app/src/main/java/com/massive/BackupModule.kt
index 9d87d26..ef365c6 100644
--- a/android/app/src/main/java/com/massive/BackupModule.kt
+++ b/android/app/src/main/java/com/massive/BackupModule.kt
@@ -8,6 +8,7 @@ import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.documentfile.provider.DocumentFile
+import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
@@ -73,6 +74,18 @@ class BackupModule constructor(context: ReactApplicationContext?) :
alarmMgr.cancel(pendingIntent)
}
+ @ReactMethod()
+ fun exportToCSV(promise: Promise) {
+ try {
+ val db = DatabaseHelper(reactApplicationContext)
+ db.exportToCSV()
+ promise.resolve("Export successful!")
+ }
+ catch (e: Exception) {
+ promise.reject("ERROR", e)
+ }
+ }
+
init {
reactApplicationContext.registerReceiver(copyReceiver, IntentFilter(COPY_BROADCAST))
}
diff --git a/android/app/src/main/java/com/massive/DatabaseHelper.kt b/android/app/src/main/java/com/massive/DatabaseHelper.kt
index f02568a..22bc01b 100644
--- a/android/app/src/main/java/com/massive/DatabaseHelper.kt
+++ b/android/app/src/main/java/com/massive/DatabaseHelper.kt
@@ -3,6 +3,10 @@ package com.massive
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
+import android.os.Environment
+import com.opencsv.CSVWriter
+import java.io.File
+import java.io.FileWriter
class DatabaseHelper(context: Context) :
SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
@@ -11,6 +15,32 @@ class DatabaseHelper(context: Context) :
private const val DATABASE_VERSION = 1
}
+ fun exportToCSV() {
+ val exportDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
+ if (!exportDir.exists()) {
+ exportDir.mkdirs()
+ }
+
+ val file = File(exportDir, "gym_sets.csv")
+ file.createNewFile()
+
+ val csvWrite = CSVWriter(FileWriter(file))
+ val db = this.readableDatabase
+ val cursor = db.rawQuery("SELECT * FROM sets", null)
+ csvWrite.writeNext(cursor.columnNames)
+
+ while(cursor.moveToNext()) {
+ val arrStr = arrayOfNulls(cursor.columnCount)
+ for(i in 0 until cursor.columnCount) {
+ arrStr[i] = cursor.getString(i)
+ }
+ csvWrite.writeNext(arrStr)
+ }
+
+ csvWrite.close()
+ cursor.close()
+ }
+
override fun onCreate(db: SQLiteDatabase) {
}
diff --git a/package.json b/package.json
index 27e92a7..571d2a1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "massive",
- "version": "2.5",
+ "version": "2.6",
"private": true,
"license": "GPL-3.0-only",
"scripts": {