Merhaba arkadaşlar. Yaptığım çalışmada realm db kullandım.Kullandığım bu db ‘deki verileri csv dosyası olarak alıp mail göndermem gerekmekteydi.Ancak ing. ve türkçe olarak detaylı bir örnek bulamadım yada gözden kaçırdığım yerler oldu.
Bu konuya giriş yapmadan önce .csv dosyası nedir,çalışma mantığı nedir araştırılması size çok güzel bir bilgi verecektir.Burada güzel bir örnek mevcut.
Kısaca açıklayacak olursak csv dosyasında excel göz önünde bulundurucak olursak virgüller(,) sütünları, satırlar (bir alt satıra geçmek) ‘da satırları oluşturmaktadır.
Şimdi bunu göz önüne bulundurduğumuzda. Android uygulamamıza geri dönecek olursak.Benim oluşturduğum db hiyerarşisi aşağıdaki resimdeki gibi.
Yani hiyerarşiyi biraz daha açıklayacak olursam. Önce bir kullanıcı kaydediyorum.Sonra okullanıcıya ait test yapıldığı bir yer vucudunda (vucundunda neresinde ölçüm yapıldı ise)sonra vucudunun ölçüm yapılan yerinin neresi olduğu (örn test yeri kolu olsun side sağ kol yada sol koldur.).Sonrada bunu tarih olarak ayrı bir hiyerarşide tutuyorum. En sonda da bu ölçüme ait bütün kullanıcı verileri kaydediyorum.(Grafik verileri , max kuvvet ,ölçüm süresi vs..).Eyer buradaki anlatım iyi fikir vermediyse videoyu izlemeniz biraz fikir verecektir umuyorum.
Şimdi de RealmDB Kod yapısına geçelim. Buraya kadar anlattığımız hiyerarşi yapısı android realm database ‘de nasıl uygulanır onu görelim.
Hiyerarşi sırasına göre kodlar aşağıdaki gibidir.
RealmUsers.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
import io.realm.Realm; import io.realm.RealmList; import io.realm.RealmObject; import io.realm.annotations.PrimaryKey; /** * Created by TR on 10/08/2016. */ public class RealmUsers extends RealmObject { @PrimaryKey private String id; private String ad; private String soyAd; private String boy; private String kilo; private String birthYear; public RealmList<RealmTest> realmTests; public RealmList<RealmTest> getRealmTests() { return realmTests; } public void setRealmTests(RealmList<RealmTest> realmTests) { this.realmTests = realmTests; } public String getAd() { return ad; } public void setAd(String ad) { this.ad = ad; } public String getSoyAd() { return soyAd; } public void setSoyAd(String soyAd) { this.soyAd = soyAd; } public String getBoy() { return boy; } public void setBoy(String boy) { this.boy = boy; } public String getKilo() { return kilo; } public void setKilo(String kilo) { this.kilo = kilo; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getBirthYear() { return birthYear; } public void setBirthYear(String birthYear) { this.birthYear = birthYear; } } |
Your ads will be inserted here by
Easy Plugin for AdSense.
Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.
RealmTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import io.realm.RealmList; import io.realm.RealmObject; import io.realm.annotations.PrimaryKey; /** * Created by TR on 06/09/2016. */ public class RealmTest extends RealmObject { private String test; @PrimaryKey private String id; public RealmList<RealmSide> realmSides; public RealmList<RealmSide> getRealmSides() { return realmSides; } public void setRealmSides(RealmList<RealmSide> realmSides) { this.realmSides = realmSides; } public String getTest() { return test; } public void setTest(String test) { this.test = test; } public String getId() { return id; } public void setId(String id) { this.id = id; } } |
RealmSide.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import io.realm.RealmList; import io.realm.RealmObject; import io.realm.annotations.PrimaryKey; /** * Created by TR on 06/09/2016. */ public class RealmSide extends RealmObject { private String side; private String id; public RealmList<RealmTarih> realmTarihs; public RealmList<RealmTarih> getRealmTarihs() { return realmTarihs; } public void setRealmTarihs(RealmList<RealmTarih> realmTarihs) { this.realmTarihs = realmTarihs; } public String getSide() { return side; } public void setSide(String side) { this.side = side; } public String getId() { return id; } public void setId(String id) { this.id = id; } } |
RealmTarih.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import io.realm.RealmList; import io.realm.RealmObject; /** * Created by TR on 13/08/2016. */ public class RealmTarih extends RealmObject { private String date; private String maxF; private String uygulananF; private String olcumTime; private String zirveTime; public RealmList<RealmGrafikData> grafikDatas; public String getDate() { return date; } public void setDate(String date) { this.date = date; } public RealmList<RealmGrafikData> getGrafikDatas() { return grafikDatas; } public void setGrafikDatas(RealmList<RealmGrafikData> grafikDatas) { this.grafikDatas = grafikDatas; } public String getMaxF() { return maxF; } public void setMaxF(String maxF) { this.maxF = maxF; } public String getUygulananF() { return uygulananF; } public void setUygulananF(String uygulananF) { this.uygulananF = uygulananF; } public String getOlcumTime() { return olcumTime; } public void setOlcumTime(String olcumTime) { this.olcumTime = olcumTime; } public String getZirveTime() { return zirveTime; } public void setZirveTime(String zirveTime) { this.zirveTime = zirveTime; } } |
Son olarak kullanıcı verilerini ve grafik verilerini tutttuğum class
RealmGrafikData.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
import io.realm.RealmList; import io.realm.RealmObject; /** * Demo class that encapsulates data stored in realm.io database. * This class represents data suitable for all chart-types. */ public class RealmGrafikData extends RealmObject { private float yValue; private float xValue; private float open, close, high, low; private float bubbleSize; private RealmList<RealmFloat> stackValues; private String someStringField; /** * label for pie entries */ private String label; // ofc there could me more fields here... public RealmGrafikData() { } public RealmGrafikData(float yValue) { this.yValue = yValue; } public RealmGrafikData(float xValue, float yValue) { this.xValue = xValue; this.yValue = yValue; } public float getyValue() { return yValue; } public void setyValue(float yValue) { this.yValue = yValue; } public float getxValue() { return xValue; } public void setxValue(float xValue) { this.xValue = xValue; } public RealmList<RealmFloat> getStackValues() { return stackValues; } public void setStackValues(RealmList<RealmFloat> stackValues) { this.stackValues = stackValues; } public float getOpen() { return open; } public void setOpen(float open) { this.open = open; } public float getClose() { return close; } public void setClose(float close) { this.close = close; } public float getHigh() { return high; } public void setHigh(float high) { this.high = high; } public float getLow() { return low; } public void setLow(float low) { this.low = low; } public float getBubbleSize() { return bubbleSize; } public void setBubbleSize(float bubbleSize) { this.bubbleSize = bubbleSize; } public String getSomeStringField() { return someStringField; } public void setSomeStringField(String someStringField) { this.someStringField = someStringField; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } } |
gördüğünüz gibi realm database hiyerarşisini ben böyle kurdum.Eksiklerim mutlaka olacak realmdb’yi ilk kullanışım.Mutlaka size bir fikir sunacağına inanıyorum.
Şimdi daha çok detaya girmeden realmdb datalarını .CSV dosyasına dönüştürmeye ve mail olarak göndermeye bakalım isterseniz.
bakınız: video’ada 2:20 sn başlamaktadır.
ADIM 1: Butona basılacak ve verileri gönderilecek kullanıcı seçilecek, mail adresi yazılıp gönder butonuna basılacak.
Şimdi bu adım uygulamada önce butona bastığında verileri telefon hafızasına kaydedelim oradan mail’e ekleyelim ve gönderelim.
Verileri telefon hafızasına kaydedeceğimiz için önce uygulamaya yazma izni vermemiz lazım.Bunu da android 6.0 la gelen runtime permission ile yapalım.Butona bastığımız yerde önce.
1 2 3 4 5 6 |
int a = checkStoragePermissions(getActivity()); if (a == PackageManager.PERMISSION_DENIED) { return; } |
dedik ve kontrol ettik eyer izin yoksa kullanıcıdan izin isteyeceğiz vermezse sonraki adıma geçiş yok.
sonra bir custom dialog oluşturduk .
1 |
showCustomViewBackup(); |
Mail gönderme butonuna bastıktan sonra kullanıcı izin vermişse geçekleşecek showCustomDialog kodları aşağıda burada yaptıklarımızı sırayla anlatacak olursak
dialog başlıklarımızı,layout’umuzu,positive ve negative butonlarını tanımladık daha sonrası ise realm db gerekli verileri çekmeyi gerçekleştirdik. Sonra RealmBackUpReastore adında bir class oluşturduk ve bu class’ aldığımız verileri gönderdik.Bu veriler kaydedilecek dosyanın adı , ve kullanıcın RealmDb referanslarını gönderdik.Sonrası RealmBackUpReastore class ında gerçekleşecek. RealmDb deki veriler csv dosyasına dönüştürüldükten sonra cihaz hafızasına kaydedilir.Ve sonra yine bu showCustomDialog ‘ metot’umuzda mail gönderme işlemi yapılır ve işlemler bitirilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
public void showCustomViewBackup() { MaterialDialog dialog = new MaterialDialog.Builder(getActivity()) .title(R.string.send_email) .customView(R.layout.dialog_backup_customview, true) .positiveText(R.string.send) .negativeText(android.R.string.cancel) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { // spinnerBackUp.getSelectedItem().toString(); int ilk=spinnerBackUp.getSelectedItem().toString().indexOf("{id:"); int son=spinnerBackUp.getSelectedItem().toString().indexOf("},{ad:"); int adSon=spinnerBackUp.getSelectedItem().toString().indexOf("},{soyAd:"); int soyAdSon=spinnerBackUp.getSelectedItem().toString().indexOf("},{boy:"); String id=spinnerBackUp.getSelectedItem().toString().substring(ilk+4,son); String ad=spinnerBackUp.getSelectedItem().toString().substring(son+6,adSon); String soyAd=spinnerBackUp.getSelectedItem().toString().substring(adSon+9,soyAdSon); Log.d("zms","ad: "+ad+" sy: "+soyAd+" id: "+id); Calendar c = Calendar.getInstance(); SimpleDateFormat df = new SimpleDateFormat("HH_mm_ss_dd_MM_yyyy"); String formattedDate = df.format(c.getTime()); RealmBackupRestore realmBackupRestore=new RealmBackupRestore(getActivity()); realmBackupRestore.backup(id,formattedDate); String filename=ad+"_"+soyAd+"_"+formattedDate+".csv"; File EXPORT_REALM_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File filelocation = new File(EXPORT_REALM_PATH, filename); Uri path = Uri.fromFile(filelocation); Intent emailIntent = new Intent(Intent.ACTION_SEND); // set the type to 'email' emailIntent .setType("vnd.android.cursor.dir/email"); String to[] = {edit_email.getText().toString()}; emailIntent .putExtra(Intent.EXTRA_EMAIL, to); // the attachment emailIntent .putExtra(Intent.EXTRA_STREAM, path); // the mail subject emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Mico Veri Kayıtları \n"+filename); startActivity(Intent.createChooser(emailIntent , "Send email...")); } }).build(); positiveActionEmail = dialog.getActionButton(DialogAction.POSITIVE); // positiveAction = dialog.getActionButton(DialogAction.POSITIVE); spinnerBackUp = (Spinner) dialog.getCustomView().findViewById(R.id.spinner_backUpUserList); adapter = new DotAdapter(getActivity()); allSortedDots = mRealm.where(RealmUsers.class) .findAllSortedAsync( "ad", Sort.ASCENDING, "soyAd", Sort.DESCENDING ); adapter.updateList(allSortedDots); allSortedDots.addChangeListener(this); spinnerBackUp.setAdapter(adapter); edit_email=(EditText)dialog.getCustomView().findViewById(R.id.input_email); final String emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+"; edit_email.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (edit_email.getText().toString().trim().matches(emailPattern) && s.length() > 0) { positiveActionEmail.setEnabled(s.toString().trim().length() > 0); } } @Override public void afterTextChanged(Editable s) { } }); positiveActionEmail.setEnabled(false); dialog.show(); // positiveAction.setEnabled(false); // disabled by default } |
Şimdi RealmBackupRestore class’ımızı inceleyelim.Burada yapılan işlem for ile realm db ‘ki verileri alma ve her verinin arasına virgül(,) yada bir alt satıra geç (\n) komutu koymak.Daha sonrada veriyi telefonda istenilen bir yere kaydetmek.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
import android.Manifest; import android.app.Activity; import android.content.pm.PackageManager; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.util.Log; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.security.Permission; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import io.realm.Realm; import io.realm.RealmConfiguration; import io.realm.RealmResults; import io.realm.Sort; import io.realm.exceptions.RealmMigrationNeededException; public class RealmBackupRestore { private Realm realm; RealmConfiguration config; private File EXPORT_REALM_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); private String EXPORT_REALM_FILE_NAME = "zafer.csv"; ArrayList<Integer> integers = new ArrayList<>(); private static final String KEY_ID = "id"; private static final String KEY_NAME = "AD"; private static final String KEY_LASTNAME = "SOYAD"; private static final String KEY_BOY = "BOY"; private static final String KEY_KILO = "KILO"; private static final String KEY_TEST = "TEST"; private static final String KEY_SIDE = "SIDE"; private static final int KEY_OLCUM = 1; private static final String KEY_MAX = "MAX"; private static final String KEY_AVG = "AVG"; // private static final String KEY_GENDER="gender"; // private static final String KEY_CREATED_AT="created_at"; private static final String TABLE_USER = "User"; private final static String TAG = RealmBackupRestore.class.getName(); private Activity activity; // Storage Permissions private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; public RealmBackupRestore(Activity activity) { this.activity = activity; start(); } public void backup(String id,String date) { // First check if we have storage permissions int a = checkStoragePermissions(activity); if (a == PackageManager.PERMISSION_DENIED) { return; } Log.d(TAG, "Realm DB Path = " + realm.getPath()); String formattedDate=date; RealmUsers realmUsers = realm.where(RealmUsers.class).equalTo("id", id).findFirst(); String CREATER_USER_TABLES = ",," + KEY_NAME + "," + KEY_LASTNAME + "," + KEY_BOY + "," + KEY_KILO + "\n" + ",," + realmUsers.getAd() + "," + realmUsers.getSoyAd() + "," + realmUsers.getBoy() + "," + realmUsers.getKilo(); RealmResults<RealmTest> realmTest = realm.where(RealmUsers.class).equalTo("id", id).findFirst().getRealmTests().where().findAllSorted("test", Sort.DESCENDING); String adx = ",1,2,3"; String CREATER_USER_TEST_TABLES_TEST=",,"; String CREATER_USER_TEST_TABLES_SIDE = ",,,"; // ArrayList<Integer> list=new ArrayList<>(); for (int add=0;add<realmTest.size();add++){ CREATER_USER_TEST_TABLES_TEST+=realmTest.get(add).getTest(); int avg=0; for (int add1=0;add1<realmTest.get(add).getRealmSides().where().findAll().size();add1++){ // adx+=","+(add1+1); // String geleSide=realmTest.get(add).getRealmSides().where().findAllSorted("side",Sort.DESCENDING).get(add1).getSide(); String geleSide=realmTest.get(add).getRealmSides().where().findAll().get(add1).getSide(); String geleSideEksiBir = ""; if(add1!=0) { geleSideEksiBir = realmTest.get(add).getRealmSides().where().findAll().get(add1 - 1).getSide(); if(!geleSideEksiBir.equals(geleSide)) { if(add1==0) { CREATER_USER_TEST_TABLES_TEST += "," + geleSide; }else { CREATER_USER_TEST_TABLES_TEST += "\n,,," + geleSide; } } else{ CREATER_USER_TEST_TABLES_TEST+=""; } } else { CREATER_USER_TEST_TABLES_TEST+=","+geleSide; } for (int add2=0;add2<realmTest.get(add).getRealmSides().where().findAll().get(add1).getRealmTarihs().where().findAll().size();add2++){ avg+=Integer.parseInt(realmTest.get(add).getRealmSides().where().findAll().get(add1).getRealmTarihs().where().findAll().get(add2).getMaxF()); CREATER_USER_TEST_TABLES_TEST+=","+realmTest.get(add).getRealmSides().where().findAll().get(add1).getRealmTarihs().where().findAll().get(add2).getMaxF(); } if(add1==(realmTest.get(add).getRealmSides().where().findAll().size()-1)) { CREATER_USER_TEST_TABLES_TEST += "\n,,"; } } CREATER_USER_TEST_TABLES_TEST+=","+KEY_AVG+":"+","+avg/realmTest.get(add).getRealmSides().where().findAll().size()+"\n,,"; } // sideSayisi(realmTest); // String asd[] = testYazdirma(realmTest).split(":"); String CREATER_USER_TEST_TABLES = ",," + KEY_TEST + "," + KEY_SIDE + adx;// + "," + KEY_AVG; CREATER_USER_TABLES += "\n\n" + CREATER_USER_TEST_TABLES+"\n"+CREATER_USER_TEST_TABLES_TEST;// + "\n" + asd[0]+","+sideYazdirma(realmTest); Log.e(TAG, "Realm DB Path = " + CREATER_USER_TABLES); FileOperations fop = new FileOperations(); fop.write(realmUsers.getAd()+"_"+realmUsers.getSoyAd() + "_" + formattedDate, CREATER_USER_TABLES); realm.close(); } private int checkStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE ); return permission; } return permission; } private Realm start() { config = new RealmConfiguration.Builder(activity).name("addUser").build(); try { realm = Realm.getInstance(config); return realm; } catch (RealmMigrationNeededException e) { try { Realm.deleteRealm(config); //Realm file has been deleted. realm = Realm.getInstance(config); return realm; } catch (Exception ex) { throw ex; //No Realm file to remove. } } } } |
KAYNAKLAR:
https://realm.io/
https://github.com/PhilJay/MPAndroidChart
https://stackoverflow.com/