Sobes.tech
Junior

Πώς θα δημιουργούσατε μια βάση δεδομένων;

sobes.tech AI

Απάντηση από AI

Χρησιμοποιώ τη Βιβλιοθήκη Room Persistence.

  1. Προσθήκη εξαρτήσεων:

    // build.gradle (επίπεδο εφαρμογής)
    dependencies {
        def room_version = "2.5.2" // ή η τρέχουσα έκδοση
    
        implementation("androidx.room:room-runtime:$room_version")
        annotationProcessor("androidx.room:room-compiler:$room_version") // Για Kotlin χρησιμοποιήστε kapt("...")
    
        // Προαιρετικά: Υποστήριξη Kotlin Extensions και Coroutines για το Room
        implementation("androidx.room:room-ktx:$room_version")
    }
    
  2. Ορισμός Entities (πινάκων):

    Δημιουργώ μια κλάση, σημειωμένη με @Entity. Κάθε πεδίο θα είναι μια στήλη και το @PrimaryKey θα είναι το πρωτεύον κλειδί.

    // User.java
    import androidx.room.Entity;
    import androidx.room.PrimaryKey;
    
    @Entity(tableName = "users")
    public class User {
        @PrimaryKey(autoGenerate = true)
        public int id;
    
        public String firstName;
        public String lastName;
    }
    
  3. Ορισμός DAO (Data Access Object):

    Δημιουργώ μια διεπαφή, σημειωμένη με @Dao, με μεθόδους για πρόσβαση στα δεδομένα (insert, update, delete, query).

    // UserDao.java
    import androidx.room.Dao;
    import androidx.room.Delete;
    import androidx.room.Insert;
    import androidx.room.OnConflictStrategy;
    import androidx.room.Query;
    import androidx.room.Update;
    
    import java.util.List;
    
    @Dao
    public interface UserDao {
        @Query("SELECT * FROM users")
        List<User> getAll();
    
        @Query("SELECT * FROM users WHERE id IN (:userIds)")
        List<User> loadAllByIds(int[] userIds);
    
        @Query("SELECT * FROM users WHERE first_name LIKE :first AND " +
               "last_name LIKE :last LIMIT 1")
        User findByName(String first, String last);
    
        @Insert(onConflict = OnConflictStrategy.IGNORE)
        void insertAll(User... users);
    
        @Delete
        void delete(User user);
    
        @Update
        void updateUsers(User... users);
    }
    
  4. Ορισμός βάσης δεδομένων:

    Δημιουργώ μια αφηρημένη κλάση που επεκτείνει το RoomDatabase, σημειωμένη με @Database. Περιλαμβάνει λίστα οντοτήτων και DAO.

    // AppDatabase.java
    import androidx.room.Database;
    import androidx.room.RoomDatabase;
    
    @Database(entities = {User.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract UserDao userDao();
    }
    
  5. Αρχικοποίηση βάσης δεδομένων:

    Λαμβάνω ένα στιγμιότυπο της βάσης δεδομένων, συνήθως στην κλάση Application ή Activity (αν και προτιμάται στην Application για singleton).

    // Στην κλάση Activity ή Application
    import android.content.Context;
    import androidx.room.Room;
    
    public class DatabaseInitializer {
        private static AppDatabase db;
    
        public static synchronized AppDatabase getDatabase(Context context) {
            if (db == null) {
                db = Room.databaseBuilder(context.getApplicationContext(),
                               AppDatabase.class, "database-name")
                        // .allowMainThreadQueries() // Δεν συνιστάται για παραγωγή
                        // .fallbackToDestructiveMigration() // Προσεκτικά με τις μεταναστεύσεις
                        .build();
            }
            return db;
        }
    }
    
  6. Εκτέλεση λειτουργιών με δεδομένα:

    Αποκτώντας το στιγμιότυπο DAO, εκτελώ λειτουργίες στη βάση δεδομένων, προτιμότερο σε background thread (π.χ., χρησιμοποιώντας AsyncTask, Executors, Coroutines, RxJava).

    // Στο Activity ή σε άλλο μέρος
    new Thread(() -> {
       AppDatabase db = DatabaseInitializer.getDatabase(getApplicationContext());
       UserDao userDao = db.userDao();
    
       // Εισαγωγή
       User user1 = new User();
       user1.firstName = "John";
       user1.lastName = "Doe";
       userDao.insertAll(user1);
    
       // Ανάγνωση
       List<User> allUsers = userDao.getAll();
       // ... επεξεργασία δεδομένων
    }).start();
    

Αυτή η προσέγγιση παρέχει αφαίρεση από το SQLite, απλοποιεί τη διαχείριση της βάσης δεδομένων και παρέχει έλεγχο κατά τη σύνταξη των ερωτημάτων.