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": {