Skip to content

Commit 9a5a42e

Browse files
committed
Export To CSV SQLite Database
1 parent d555814 commit 9a5a42e

File tree

8 files changed

+163
-4
lines changed

8 files changed

+163
-4
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ android {
3131
dependencies {
3232

3333
implementation 'androidx.appcompat:appcompat:1.6.1'
34-
implementation 'com.google.android.material:material:1.8.0'
34+
implementation 'com.google.android.material:material:1.6.0'
3535
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
3636
testImplementation 'junit:junit:'
3737
androidTestImplementation 'androidx.test.ext:junit:1.1.5'

app/src/main/AndroidManifest.xml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.alaminkarno.sqlitedatbase">
44

5+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
6+
57
<application
68
android:allowBackup="true"
79
android:icon="@mipmap/ic_launcher"
810
android:label="@string/app_name"
911
android:roundIcon="@mipmap/ic_launcher_round"
1012
android:supportsRtl="true"
13+
android:requestLegacyExternalStorage="true"
1114
android:theme="@style/Theme.SQLiteDatbase">
12-
<activity android:name=".UpdateDataActivity"></activity>
15+
<activity android:name=".UpdateDataActivity" />
1316
<activity android:name=".ShowDataActivity" />
14-
<activity android:name=".MainActivity">
17+
<activity android:name=".MainActivity"
18+
android:exported="true">
1519
<intent-filter>
1620
<action android:name="android.intent.action.MAIN" />
1721

app/src/main/java/com/alaminkarno/sqlitedatbase/ShowDataActivity.java

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,30 @@
11
package com.alaminkarno.sqlitedatbase;
22

3+
import androidx.annotation.NonNull;
34
import androidx.appcompat.app.AppCompatActivity;
5+
import androidx.core.app.ActivityCompat;
6+
import androidx.core.content.ContextCompat;
47
import androidx.recyclerview.widget.LinearLayoutManager;
58
import androidx.recyclerview.widget.RecyclerView;
69

10+
import android.Manifest;
711
import android.annotation.SuppressLint;
12+
import android.content.pm.PackageManager;
813
import android.database.Cursor;
914
import android.os.Bundle;
15+
import android.os.Environment;
16+
import android.view.Menu;
17+
import android.view.MenuInflater;
18+
import android.view.MenuItem;
19+
import android.widget.Toast;
1020

21+
import java.io.File;
22+
import java.io.FileWriter;
23+
import java.text.SimpleDateFormat;
1124
import java.util.ArrayList;
25+
import java.util.Date;
1226
import java.util.List;
27+
import java.util.UUID;
1328

1429
public class ShowDataActivity extends AppCompatActivity {
1530

@@ -18,6 +33,8 @@ public class ShowDataActivity extends AppCompatActivity {
1833
List<User> userList;
1934
DatabaseHelper databaseHelper;
2035

36+
final static int STORAGE_REQUEST_CODE = 1;
37+
2138

2239
@SuppressLint("NotifyDataSetChanged")
2340
@Override
@@ -45,4 +62,101 @@ protected void onCreate(Bundle savedInstanceState) {
4562
}
4663

4764
}
65+
66+
private void exportCSV() {
67+
68+
File csvFolder = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getPath()+"/"+"SQLiteDatabase");
69+
70+
if(!csvFolder.exists()){
71+
csvFolder.mkdir();
72+
}
73+
74+
75+
/// String csvFileName = UUID.randomUUID().toString() + "_database_backup.csv";
76+
77+
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
78+
79+
String csvFileName = "database_backup_"+simpleDateFormat.format(new Date())+".csv";
80+
81+
String csvPath = csvFolder.toString()+"/"+csvFileName;
82+
83+
try {
84+
FileWriter fileWriter = new FileWriter(csvPath);
85+
86+
for(int i = 0; i < userList.size(); i++){
87+
88+
fileWriter.append(""+userList.get(i).getId());
89+
fileWriter.append(",");
90+
91+
fileWriter.append(""+userList.get(i).getName());
92+
fileWriter.append(",");
93+
94+
fileWriter.append(""+userList.get(i).getAge());
95+
fileWriter.append("\n");
96+
97+
}
98+
99+
fileWriter.flush();
100+
fileWriter.close();
101+
102+
Toast.makeText(this, "Backup Completed To: "+csvPath, Toast.LENGTH_SHORT).show();
103+
104+
}
105+
catch (Exception e){
106+
Toast.makeText(this, "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show();
107+
}
108+
109+
}
110+
111+
public boolean checkStoragePermission(){
112+
return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
113+
}
114+
115+
public void requestStoragePermission(){
116+
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},STORAGE_REQUEST_CODE);
117+
}
118+
119+
120+
@Override
121+
public boolean onCreateOptionsMenu(Menu menu) {
122+
MenuInflater menuInflater = getMenuInflater();
123+
menuInflater.inflate(R.menu.menu,menu);
124+
return super.onCreateOptionsMenu(menu);
125+
}
126+
127+
@Override
128+
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
129+
130+
int id = item.getItemId();
131+
132+
if(id == R.id.menu_backup){
133+
134+
if(checkStoragePermission()){
135+
exportCSV();
136+
}else{
137+
requestStoragePermission();
138+
}
139+
140+
}else if(id == R.id.menu_restore){
141+
Toast.makeText(this, "Restore", Toast.LENGTH_SHORT).show();
142+
143+
}
144+
145+
return super.onOptionsItemSelected(item);
146+
}
147+
148+
@Override
149+
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
150+
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
151+
152+
if(requestCode == STORAGE_REQUEST_CODE){
153+
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
154+
// Export CSV
155+
exportCSV();
156+
}
157+
else{
158+
Toast.makeText(this, "Storage Permission Needed!", Toast.LENGTH_SHORT).show();
159+
}
160+
}
161+
}
48162
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="#000000"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM14,13v4h-4v-4H7l5,-5 5,5h-3z"/>
5+
</vector>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="#FFFFFF"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/>
5+
</vector>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="24dp" android:tint="#000000"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z"/>
5+
</vector>

app/src/main/res/menu/menu.xml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<menu xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto">
4+
5+
<item
6+
android:title="Menu"
7+
android:icon="@drawable/ic_baseline_menu_24"
8+
app:showAsAction="always">
9+
10+
<menu>
11+
12+
<item
13+
android:id="@+id/menu_backup"
14+
android:icon="@drawable/ic_baseline_backup_24"
15+
android:title="Backup"/>
16+
17+
<item
18+
android:id="@+id/menu_restore"
19+
android:icon="@drawable/ic_baseline_restore_24"
20+
android:title="Restore"/>
21+
22+
</menu>
23+
24+
</item>
25+
26+
</menu>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<resources>
2-
<string name="app_name">SQLite Datbase</string>
2+
<string name="app_name">SQLite Database</string>
33
</resources>

0 commit comments

Comments
 (0)