Android Studio ile SQLite Kullanımı

SQLite telefonumuzda kullandığımız uygulama ile ilgili büyük çaplı verilerin depolanması için kullanılan bir veritabanıdır. Telefonumuzda kullandığımız uygulamayı sildiğimiz zaman otomatik bir şekilde tutulan verilerde silinir. Konunun daha iyi anlaşılması için basit bir program yaparak anlamaya çalışalım. Uygulamamızda filmlerin resimleri, isimleri, tarihleri ve imdb puanlarının tutulduğu bir liste yapmaya çalışacağız.
Yukarda uygulamanın nasıl çalıştığını gösteren bir gif bulunmaktadır. Uygulamanın nasıl çalıştığını anladığımıza göre adım adım yapmaya başlayalım.
Öncelikle uygulamamızda anlam karmaşasını önlemek için bir tane java sınıfı bir tane xml dosyası üzerinde gerçekleştireceğim ve visible-invisible özelliğini kullanarak geçiş yapacağım. Tasarım kısmı olan activity_main.xml dosyamızı aşağıdaki gibi düzenliyoruz.
activity_main.xml
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 |
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.esatgozcu.sqlitekullanimi.MainActivity"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.constraint.ConstraintLayout android:id="@+id/secondLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="invisible"> <Button android:id="@+id/backButton" android:layout_width="50dp" android:layout_height="30dp" android:background="@android:drawable/ic_menu_revert" android:onClick="back" /> <ImageView android:id="@+id/imageView" android:layout_width="250dp" android:layout_height="200dp" android:layout_marginTop="48dp" android:onClick="select" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/add_image" /> <EditText android:id="@+id/movieName" android:layout_width="200dp" android:layout_height="45dp" android:layout_marginTop="16dp" android:ems="10" android:hint="Flim Adını Giriniz" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="@+id/imageView" app:layout_constraintStart_toStartOf="@+id/imageView" app:layout_constraintTop_toBottomOf="@+id/imageView" /> <EditText android:id="@+id/movieYear" android:layout_width="200dp" android:layout_height="45dp" android:layout_marginTop="16dp" android:ems="10" android:hint="Flim Yılını Giriniz" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="@+id/imageView" app:layout_constraintStart_toStartOf="@+id/imageView" app:layout_constraintTop_toBottomOf="@+id/movieName" /> <EditText android:id="@+id/movieImdb" android:layout_width="200dp" android:layout_height="45dp" android:layout_marginTop="16dp" android:ems="10" android:hint="Flim Puanını Giriniz" android:inputType="textPersonName" app:layout_constraintEnd_toEndOf="@+id/imageView" app:layout_constraintStart_toStartOf="@+id/imageView" app:layout_constraintTop_toBottomOf="@+id/movieYear" /> <Button android:id="@+id/addButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:layout_marginTop="16dp" android:onClick="save" android:text="EKLE" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/movieImdb" app:layout_constraintVertical_bias="0.0" /> </android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout> |
Flim eklerken sağ üst köşede bulunan üç noktaya tıkladığımızda ortaya çıkan menüyü nasıl yapacağımıza bakalım.
Öncelikle res klasörünün üstüne sağ tıklayarak new >> Directory diyerek menu adında bir klasör oluşturuyoruz. Daha sonra oluşturduğumuz menu klasörünün üstüne sağ tıklayarak new >> Menu resource file diyerek yeni xml dosyası oluşturuyoruz. Oluşturduğumuz xml dosyasını aşağıdaki gibi düzenliyoruz.
add_movie.xml
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id = "@+id/add_movie" android:title = "Flim Ekle"></item> </menu> |
Şimdi oluşturduğumuz menu xml dosyasını java dosyasına bağlamak için iki tane methodu MainActivity.java dosyamıza override etmemiz gerekiyor.
MainActivity.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 |
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.add_movie, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.add_movie) { // Menüden Flim Ekle Butonu seçilirse layout visible olacak. secondLayout = (ConstraintLayout)findViewById(R.id.secondLayout); // Verileri sıfırlıyoruz nameEdit.setText(""); yearEdit.setText(""); imdbEdit.setText(""); Bitmap background = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.add_image); imageView.setImageBitmap(background); secondLayout.setVisibility(View.VISIBLE); listView.setVisibility(View.INVISIBLE); } return super.onOptionsItemSelected(item); } |
Buraya kadar tasarım kısmını ve menümüzü oluşturduk geriye işin asıl kısmı olan tasarıma anlam verecek olan kısmın anlatımına geçelim. Gerekli açıklamalar kod satırları arasında yapılmıştır.
MainActivity.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 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 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 |
package com.example.esatgozcu.sqlitekullanimi; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteStatement; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.constraint.ConstraintLayout; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { ConstraintLayout secondLayout; SQLiteDatabase database; ImageView imageView; EditText nameEdit; EditText yearEdit; EditText imdbEdit; Button saveButton; Button backButton; Bitmap selectedImage; ListView listView; ArrayAdapter arrayAdapter; @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.add_movie, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.add_movie) { // Menüden Flim Ekle Butonu seçilirse layout visible olacak. secondLayout = (ConstraintLayout)findViewById(R.id.secondLayout); // Verileri sıfırlıyoruz nameEdit.setText(""); yearEdit.setText(""); imdbEdit.setText(""); Bitmap background = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.add_image); imageView.setImageBitmap(background); secondLayout.setVisibility(View.VISIBLE); listView.setVisibility(View.INVISIBLE); } return super.onOptionsItemSelected(item); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nameEdit = (EditText)findViewById(R.id.movieName); yearEdit =(EditText)findViewById(R.id.movieYear); imdbEdit = (EditText)findViewById(R.id.movieImdb); saveButton = (Button)findViewById(R.id.addButton); imageView = (ImageView)findViewById(R.id.imageView); listView = (ListView) findViewById(R.id.listView); secondLayout = (ConstraintLayout)findViewById(R.id.secondLayout); backButton = (Button)findViewById(R.id.backButton); getData(); } // Verileri databaseden çekiyoruz private void getData() { // Verilerimiz için ArrayListlerimizi oluşturuyoruz. final ArrayList<String> movieName = new ArrayList<String>(); final ArrayList<String> movieYear = new ArrayList<String>(); final ArrayList<String> movieImdb = new ArrayList<String>(); final ArrayList<Bitmap> movieImage = new ArrayList<Bitmap>(); // ArrayListleri listView'e aktarmak için adapter oluşturuyoruz arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,movieName); // ListView ile adapteri bağlıyoruz listView.setAdapter(arrayAdapter); try { /* Verilerimizi veritabanından çekip arraylistlere aktarıyoruz */ // Movies isminde yeni veritabanı oluşturuyoruz. database = this.openOrCreateDatabase("Movies", MODE_PRIVATE, null); // Veritabanımızın için movies isimli tablomuzu oluturuyoruz. database.execSQL("CREATE TABLE IF NOT EXISTS movies (name VARCHAR, year VARCHAR, imdb VARCHAR, image BLOB)"); // Bütün verileri çekiyoruz ve cursor nesnesine aktarıyoruz index numarasına göre verileri tekrardan çekeceğiz Cursor cursor = database.rawQuery("SELECT * FROM movies", null); // Verileri çekebilmek için index numaralarını alıyoruz. int nameIx = cursor.getColumnIndex("name"); int yearIx = cursor.getColumnIndex("year"); int imdbIx = cursor.getColumnIndex("imdb"); int imageIx = cursor.getColumnIndex("image"); // Satır başına gidiyoruz. cursor.moveToFirst(); while (cursor != null) { // cursor nesnesi boş değilse verilerimizi ArrayListlere aktarıyoruz. movieName.add(cursor.getString(nameIx)); movieYear.add(cursor.getString(yearIx)); movieImdb.add(cursor.getString(imdbIx)); // Resimleri ekliyoruz. byte[] byteArray = cursor.getBlob(imageIx); Bitmap image = BitmapFactory.decodeByteArray(byteArray,0,byteArray.length); movieImage.add(image); // Bir sonraki satıra geçiyoruz. cursor.moveToNext(); // ArrayAdaptere değişiklik olduğunu bildiriyoruz. arrayAdapter.notifyDataSetChanged(); } } catch (Exception e) { // Herhangi bir hata ile karşılaşıldığı zaman hatayı bastırıyoruz. e.printStackTrace(); } // ListView'den herhangi bir item seçildiği zaman.. listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Seçilen flimin verilerini aktarıyoruz. nameEdit.setText(movieName.get(position)); yearEdit.setText(movieYear.get(position)); imdbEdit.setText(movieImdb.get(position)); imageView.setImageBitmap(movieImage.get(position)); listView.setVisibility(View.INVISIBLE); secondLayout.setVisibility(View.VISIBLE); } }); } // ImageView üstüne tıklanıp resim seçilmek istendiğinde.. public void select (View view) { // Gerekli izinleri alınıp alınmadığını kontrol ediyoruz. if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // İzin alınmamış ise requestPermissions(new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, 2); } else { // İzin alındı ise resim galerisine gidiyoruz Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent,1); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { // İzin sonucunda izin verilip verilmediğini tekrardan kontrol ediyoruz if (requestCode == 2) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent,1); } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // Resim galerisinden resim seçildi ise ve data boş değil ise ... if (requestCode == 1 && resultCode == RESULT_OK && data != null) { Uri image = data.getData(); try { // Seçilen resimi ImageView'e aktarıyoruz selectedImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), image); imageView.setImageBitmap(selectedImage); } catch (IOException e) { e.printStackTrace(); } } super.onActivityResult(requestCode, resultCode, data); } public void save (View view) { String nameMovie = nameEdit.getText().toString(); String yearMovie = yearEdit.getText().toString(); String imdbMovie = imdbEdit.getText().toString(); // Resimleri byteArray şeklinde kayıt ediyoruz bu yüzden dönüşüm işlemini aşağıdaki gibi yapıyoruz. ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); selectedImage.compress(Bitmap.CompressFormat.PNG,50,outputStream); byte[] byteArray = outputStream.toByteArray(); try { database = this.openOrCreateDatabase("Movies", MODE_PRIVATE, null); database.execSQL("CREATE TABLE IF NOT EXISTS movies (name VARCHAR, image BLOB)"); // Sql sorgumuzu hazırlıyoruz. String sqlString = "INSERT INTO movies (name, year, imdb, image) VALUES (?, ?, ?, ?)"; SQLiteStatement statement = database.compileStatement(sqlString); // Verileri ekliyoruz. statement.bindString(1,nameMovie); statement.bindString(2,yearMovie); statement.bindString(3,imdbMovie); statement.bindBlob(4,byteArray); statement.execute(); // Yapılan değişiklikleri eklenmesi için getData methodunu çalıştırıyoruz. getData(); secondLayout.setVisibility(View.INVISIBLE); listView.setVisibility(View.VISIBLE); } catch (Exception e) { e.printStackTrace(); } } public void back (View view) { secondLayout.setVisibility(View.INVISIBLE); listView.setVisibility(View.VISIBLE); } } |
Böylelikle Android Studio ile nasıl veritabanı işlemlerini yapabileceğimizi görmüş olduk.
Projenin kaynak kodlarına buraya tıklayarak indirebilirsiniz.