Как сохранить и извлечь для отображения смайликов в базе данных Room (Android Studio)

#android #database #android-room #emoji

#Android #База данных #android-комната #смайлики

Вопрос:

Я создаю приложение для отслеживания настроения для Android, используя базу данных Room с языком Java. Я планирую использовать встроенные в Android смайлики, чтобы пользователь мог вводить нужные смайлики, но я не уверен, как сохранить их в базе данных Room, а затем извлечь данные для отображения в другом фрагменте?

Буду очень признателен, если кто-нибудь даст некоторые рекомендации по этому вопросу или прикрепит соответствующие обучающие видео ссылки на это, потому что я все еще новичок в разработке мобильных приложений

Ответ №1:

Что касается Room, вам нужно только сохранить некоторые способы узнать, что такое смайлик, возможно, Юникод для смайликов.

например, значение grinning face равно 0x1F600, возможно, описательное. Затем вы можете установить TextView, например, с включением смайликов.

Возможно, вы могли бы создать таблицу, содержащую только смайлики, а затем сохранить ссылку (иметь отношение) к этой таблице.

Ниже приведен очень простой пример рабочей комнаты.

Результатом будет список смайликов, отображаемых в ListView.

В этом примере есть таблица, в которой хранятся коды смайликов вместе с описанием смайликов. Таблица была названа emoji, а класс Entity является EmojiTable согласно :-

 @Entity(tableName = "emoji")
class EmojiTable {
    @PrimaryKey(autoGenerate = false)
    @ColumnInfo(name = "_id")
    Long id;
    @ColumnInfo(name = "emoji_code", index = true)
    String emoji_code;
    @ColumnInfo(name = "emojidesc")
    String emoji_desc;

    // Default constructor
    EmojiTable(){}

    // Alternative Constructor
    @Ignore
    EmojiTable(String emoji_code,String emoji_desc) {
        this.emoji_code = emoji_code;
        this.emoji_desc = emoji_desc;
    }

    // Override default toString method to return the emoji followed by it's decsription
    @Ignore
    public String toString() {
        return new String(Character.toChars(Integer.decode(emoji_code)))   " "   emoji_desc;
    }
}
 
  • 3 столбца
    • столбец _id для уникального идентификатора
    • столбец emoji_code для шестнадцатеричного кода смайлика
    • столбец emoji_desc для описания смайликов
  • Обратите внимание, что метод toString был переопределен, чтобы вернуть строку, содержащую смайлик, за которым следует его описание. Это используется для установки TextView в ListView.
    • в противном случае используется метод toString по умолчанию, который отображает объект.

Чтобы сопровождать таблицу смайликов, используйте DAO AllDao для действий с базой данных :-

 @Dao
interface AllDao {
    
    // Insertion of a row
    @Insert(entity = EmojiTable.class, onConflict = OnConflictStrategy.IGNORE)
    long insertEmoji(EmojiTable e);
    //Deletion of ALL rows
    @Query("DELETE FROM emoji")
    int deleteAll();
    // Get ALL rows
    @Query("SELECT * FROM emoji")
    List<EmojiTable> getAllEmojis();
    // Get a row by the id passed to the method 
    @Query("SELECT * FROM emoji WHERE emoji._id = :id")
    EmojiTable getEmojiById(Long id);
    // Get the number of rows (used to detect changes)
    @Query("SELECT count(*) FROM emoji")
    Long getRowsInEmojiTable();
}
 

Абстрактный класс @Database MyDatabase

 @Database(entities = {EmojiTable.class}, version = 1)
abstract class MyDatabase extends RoomDatabase {
    abstract AllDao getAllDao();
}
 

Класс, а именно EmojiList, который определяет эмодзи / основной список эмодзи.

  • использование этих изменений (если изменяется количество смайликов) позволяет изменять смайлики, хранящиеся в базе данных (в случае развертывания новой версии приложения).

.

 class EmojiList {

    public static final EmojiTable[] EMOJIS =  {
            new EmojiTable("0x1F600","Grinning Face"),
            new EmojiTable("0x1F602","Unknown"),
            new EmojiTable("0x1F911","Money-Mouth Face")
    };
}
 
  • определены 3 смайлика

Макет, который включает в себя ListView для отображения списка смайликов :-

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        />

    <ListView
        android:id="@ id/emojilist"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/design_default_color_secondary"/>

</LinearLayout>
 
  • Здесь нет ничего особенного, кроме цвета фона, чтобы увидеть, где находится список.

Наконец, собрав все это вместе, Activity MainActivity

 public class MainActivity extends AppCompatActivity {

    MyDatabase db;
    AllDao dao;
    List<EmojiTable> emojiList_list;
    ListView emojiList_listview;
    ArrayAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // Instantiate the MyDatabase object with a built Room Database
        db = Room.databaseBuilder(this,MyDatabase.class,"mydb")
                .allowMainThreadQueries()
                .build();
        // Instantiate the dao interface
        dao = db.getAllDao();
        // Check to see if the emoji's stored equals the master list
        // If not rebuild the emjoi table
        if (dao.getRowsInEmojiTable() != EmojiList.EMOJIS.length) {
            dao.deleteAll(); // Delete all existing rows
            for(EmojiTable e: EmojiList.EMOJIS) {
                dao.insertEmoji(e);
            }
        }
        // Very simple list of all emojis
        emojiList_list = dao.getAllEmojis(); // 
        emojiList_listview = this.findViewById(R.id.emojilist);
        adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,emojiList_list);
        emojiList_listview.setAdapter(adapter);
    }
}
 

Результат

При запуске приложение выглядит так :-

введите описание изображения здесь

База данных (через инспектор базы данных) :-

введите описание изображения здесь