主頁 > 作業系統 > 如何在RoomDatabase上創建同一物體的多個表?

如何在RoomDatabase上創建同一物體的多個表?

2021-12-31 14:44:30 作業系統

問題

假設您有多個花園,每個花園都有不同數量的植物。你的作業是不時檢查每個花園的每一株植物。每次訪問您都必須注釋植物的某些屬性,例如是否澆水充足和高度。該應用程式旨在在這些訪問期間提供幫助。

我的方法

我想使用房間資料庫。所以我創建了一個物體 GardenVisit,它具有唯一的 id 和訪問日期。然后我需要一個 GardenAnnotation 物體。該物體將為花園中的每株植物排成一行,并在訪問日標注其 id 和特征。我想為每個 GardenVisit 創建一個表并將它們與一對一的關系聯系起來,但我找不到辦法做到這一點。

為什么我要為每次 GardenVisit 創建一個 GardenAnnotation 表?

在應用程式中,您可以洗掉花園訪問。所以,在洗掉它時,它也應該洗掉它的 GardenAnnotation 表。這似乎是擁有此功能的最簡單方法。

結論

如何在 Room Database 中創建同一物體的多個表并將它們與另一個表鏈接?

如果你有更好的方法,如果你能分享它,我將不勝感激。實際上,創建許多相同物體的表感覺很奇怪。

uj5u.com熱心網友回復:

為了拆分基本相同的布局(架構)而使用多個表可能沒有多大意義,并且可能會使問題復雜化。

根據您的描述,您有一些共同點:-

  • 花園。
  • 植物。
  • 訪問次數
  • 性狀。
  • 注釋(每次訪問的發現/特征)。

我會相應地建議表格。

一個花園表可能具有但不限于花園的人類識別符號(Kew,巴比倫空中花園......)和(因為它已經存在并且有效)識別符號(id)。

一個植物表(蒲公英,薔薇....)與列編號,名稱及有關植物也許還有其他資訊。

將植物映射/鏈接/關聯到花園的表(未提及),允許多對多關系(花園可以有許多植物,植物可以在許多花園中使用)。2 列一列用于地圖到花園,另一列用于植物。

一個訪問表,其中包含訪問的日期/時間,可能是開始/結束和地圖/鏈接......到花園。

一個特質表如水分充足,死(如果我照料廠)....列將ID和特征(具體要求)

一個注釋表,將鏈接到訪問(并因此鏈接到花園)和鏈接到花園內的植物以及指向要分配的特征的鏈接。

因此模式可以基于 SQLite(以演示資料庫/關系如何從 SQLite pov 作業):-

DROP TABLE IF EXISTS annotation;
DROP TABLE IF EXISTS trait;
DROP TABLE IF EXISTS visit;
DROP TABLE IF EXISTS garden_plant_map;
DROP TABLE IF EXISTS garden;
DROP TABLE IF EXISTS plant;

CREATE TABLE IF NOT EXISTS garden (garden_id INTEGER PRIMARY KEY, garden_name TEXT UNIQUE);
INSERT INTO garden (garden_name) 
    VALUES('Kew' /* id will be 1 */),('Hanging Gardens of Babylon' /* id will be 2 and so on (probably)*/)
;

CREATE TABLE IF NOT EXISTS plant(plant_id INTEGER PRIMARY KEY, plant_name TEXT UNIQUE);
INSERT INTO plant (plant_name) 
    VALUES('Rose' /* id will be 1 etc*/),('Dandelion'),('Poppy'),('Azelia'),('Oak'),('Beech')
;
CREATE TABLE IF NOT EXISTS garden_plant_map (
    garden_map INTEGER,
    plant_map INTEGER,
    PRIMARY KEY (garden_map,plant_map)
    FOREIGN KEY (garden_map) REFERENCES garden(garden_id) ON DELETE CASCADE ON UPDATE CASCADE
    FOREIGN KEY (plant_map) REFERENCES plant(plant_id) ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO garden_plant_map
    VALUES
        (1 /* Kew */, 3 /* Poppy*/),
        (1 /* Kew */, 1 /* Rose */),
        (2 /* Babylon */, 2 /* Dandelion */),
        (2,5),(2,6) /*Oak and Beech for Babylon */
;
CREATE TABLE IF NOT EXISTS trait (trait_id INTEGER PRIMARY KEY, trait_description UNIQUE);
INSERT INTO trait (trait_description)
    VALUES ('Well watered'),('Dead'),('Stressed'),('Flourishing'),('under watered')
;
CREATE TABLE IF NOT EXISTS visit (
    visit_id INTEGER PRIMARY KEY, 
    garden_map INTEGER,
    start_of_visit TEXT /* will be date in yyyy-mm-dd hh:mm:ss format*/,
    end_of_visit TEXT,
    visit_done INTEGER, /* 0/false or 1 (or greater)/true */
    FOREIGN KEY (garden_map) REFERENCES garden(garden_id) ON DELETE CASCADE ON UPDATE CASCADE
);

INSERT INTO visit (garden_map,start_of_visit,end_of_visit,visit_done)
    VALUES 
        (1,'2020-01-01 08:00','2021-01-01 10:00',true)
        ,(1,'2021-01-01 08:00','2021-01-01 10:00',false)
        ,(2,'2021-02-01 08:00','2021-02-01 10:00',false)
        ,(1,'2021-03-01 08:00','2021-03-01 10:00',false)
        ,(2,'2021-04-01 08:00','2021-04-01 10:00',false)
;

CREATE TABLE IF NOT EXISTS annotation (
    annotation_id INTEGER PRIMARY KEY,
    visit_map INTEGER REFERENCES visit(visit_id) ON DELETE CASCADE ON UPDATE CASCADE,
    trait_map INTEGER REFERENCES trait(trait_id) ON DELETE CASCADE ON UPDATE CASCADE,
    garden_plant_map_garden_map INTEGER, garden_plant_map_plant_map INTEGER,
    FOREIGN KEY (garden_plant_map_garden_map,garden_plant_map_plant_map) REFERENCES garden_plant_map(garden_map,plant_map)
);

INSERT INTO annotation (visit_map, trait_map, garden_plant_map_garden_map, garden_plant_map_plant_map ) 
    VALUES
        (1 /* visit on 1/1/20 */, 1 /* Well watered */, 1 /* Kew */, 3 /* Poppy */ )
        , (1 /* visit on 1/1/20 */, 5 /* under watered */, 1 /* Kew */, 1 /* Rose */ )
        
        , (3 /* visit on 1/2/21 */, 2 /* dead */, 2 /* Babylon */, 2 /* Dandelion */ )
        , (3 /* visit on 1/2/21 */, 4 /* flourishing */, 2 /* babylon */, 6 /* Beech */ )
        , (3 /* visit on 1/2/21 */, 3 /* stressed */, 2 /* babylon */, 5 /* Beech */ )      
;

SELECT 
    garden_name,
    start_of_visit,end_of_visit, visit_done,
    plant.plant_name,
    trait.trait_description,
        CASE WHEN visit_done THEN 'Completed' ELSE 'ToDO' END AS status
FROM annotation
JOIN visit ON visit.visit_id = annotation.visit_map
JOIN garden ON visit.garden_map = garden.garden_id
JOIN plant ON garden_plant_map_plant_map = plant_id
JOIN trait ON trait_map = trait_id
;

查詢的結果是:-

如何在 Room Database 上創建同一物體的多個表?

假設 id 為 1 的訪問被洗掉(盡管您可能認為visit_done 是真的有效洗掉(因此您可以隨時回到過去)),例如使用:-

DELETE FROM visit WHERE visit_id = 3;

然后相同的查詢回傳:-

如何在 Room Database 上創建同一物體的多個表?

即訪問 3 的三個注釋已被洗掉

忽略洗掉,即訪問剩余的visit_id為3,然后表格看起來像:-

花園

如何在 Room Database 上創建同一物體的多個表?

植物

如何在 Room Database 上創建同一物體的多個表?

特征

如何在 Room Database 上創建同一物體的多個表?

訪問

如何在 Room Database 上創建同一物體的多個表?

Garden_plant_map

如何在 Room Database 上創建同一物體的多個表?

注解

如何在 Room Database 上創建同一物體的多個表?

uj5u.com熱心網友回復:

物體。在 Kotlin 中,來自上述(正在進行中/未經測驗):-

花園

/* CREATE TABLE IF NOT EXISTS garden (garden_id INTEGER PRIMARY KEY, garden_name TEXT UNIQUE);*/
@Entity( indices = [Index(value = ["garden_name"], unique = true)])
data class Garden (
    @PrimaryKey
    @ColumnInfo(name = "garden_id")
    val id: Long? = null, /* specifying null or not supplying value results in auto-generated id with overheads of autogenerate = true */
    @ColumnInfo(name = "garden_name")
    val name: String
)

植物

/* CREATE TABLE IF NOT EXISTS plant(plant_id INTEGER PRIMARY KEY, plant_name TEXT UNIQUE); */
@Entity(indices = [Index( value = ["plant_name"], unique = true)])
data class Plant (
    @PrimaryKey
    @ColumnInfo(name = "plant_id")
    val id: Long? = null,
    @ColumnInfo(name = "plant_name")
    val name: String
)

特征

/* CREATE TABLE IF NOT EXISTS trait (trait_id INTEGER PRIMARY KEY, trait_description UNIQUE); */
@Entity(indices = [Index(value = ["trait_description"], unique = true)])
data class Trait(
    @PrimaryKey
    @ColumnInfo(name = "trait_id")
    val id: Long? = null,
    @ColumnInfo(name = "trait_description")
    val description: String
)

花園植物地圖

/* CREATE TABLE IF NOT EXISTS garden_plant_map (
    garden_map INTEGER,
    plant_map INTEGER,
    PRIMARY KEY (garden_map,plant_map)
    FOREIGN KEY (garden_map) REFERENCES garden(garden_id) ON DELETE CASCADE ON UPDATE CASCADE
    FOREIGN KEY (plant_map) REFERENCES plant(plant_id) ON DELETE CASCADE ON UPDATE CASCADE
   );
 */
@Entity(
    tableName = "garden_plant_map",
    primaryKeys = ["garden_map","plant_map"],
    foreignKeys = [
        ForeignKey(
            entity =  Garden::class,
            parentColumns = ["garden_id"],
            childColumns = ["garden_map"],
            onDelete = CASCADE,
            onUpdate = CASCADE
        ),
        ForeignKey(
            entity = Plant::class,
            parentColumns = ["plant_id"],
            childColumns = ["plant_map"],
            onDelete = CASCADE,
            onUpdate = CASCADE
        )
    ]
)
data class GardenPlantMap(
    val garden_map: Long,
    @ColumnInfo(index = true) /* indexed as will likely map via column */
    val plant_map: Long
)

訪問

/*
    CREATE TABLE IF NOT EXISTS visit (
        visit_id INTEGER PRIMARY KEY,
        garden_map INTEGER,
        start_of_visit TEXT /* will be date in yyyy-mm-dd hh:mm:ss format*/,
        end_of_visit TEXT,
        visit_done INTEGER, /* 0/false or 1 (or greater)/true */
        FOREIGN KEY (garden_map) REFERENCES garden(garden_id) ON DELETE CASCADE ON UPDATE CASCADE
    );
 */
@Entity(
    foreignKeys = [
            ForeignKey(
                entity = Garden::class,
                parentColumns = ["garden_id"],
                childColumns = ["garden_map"],
                onDelete = CASCADE,
                onUpdate = CASCADE
            )
    ]
)
data class Visit(
    @PrimaryKey
    @ColumnInfo(name = "visit_id")
    val id: Long? = null,
    @ColumnInfo(index = true)
    val garden_map: Long,
    @ColumnInfo(name = "start_of_visit")
    val visitStart: String, /* could be Long */
    @ColumnInfo(name = "end_of_visit")
    val visitEnd: String,
    @ColumnInfo(name = "visit_done")
    val visitDone: Boolean
)

注解

/*
    CREATE TABLE IF NOT EXISTS annotation (
        annotation_id INTEGER PRIMARY KEY,
        visit_map INTEGER REFERENCES visit(visit_id) ON DELETE CASCADE ON UPDATE CASCADE,
        trait_map INTEGER REFERENCES trait(trait_id) ON DELETE CASCADE ON UPDATE CASCADE,
        garden_plant_map_garden_map INTEGER, garden_plant_map_plant_map INTEGER,
        FOREIGN KEY (garden_plant_map_garden_map,garden_plant_map_plant_map) REFERENCES garden_plant_map(garden_map,plant_map)
    );
 */
@Entity(
    indices = [
        Index(value = ["garden_plant_map_garden_map","garden_plant_map_plant_map"])

              ],
    foreignKeys = [
        ForeignKey(
            entity = Visit::class,
            parentColumns = ["visit_id"],
            childColumns = ["visit_map"],
            onDelete = CASCADE,
            onUpdate = CASCADE
        ),
        ForeignKey(
            entity = Trait::class,
            parentColumns = ["trait_id"],
            childColumns = ["trait_map"],
            onDelete = CASCADE,
            onUpdate = CASCADE
        ),
        ForeignKey(
            entity = GardenPlantMap::class,
            parentColumns = ["garden_map","plant_map"],
            childColumns = ["garden_plant_map_garden_map","garden_plant_map_plant_map"] /*,
            onDelete = CASCADE,
            onUpdate = CASCADE
            */
        )

    ]
)
data class Annotation(
    @PrimaryKey
    @ColumnInfo(name = "annotation_id")
    val id: Long? = null,
    @ColumnInfo(name = "visit_map", index = true)
    val visitMap: Long,
    @ColumnInfo(name = "trait_map", index = true)
    val traitMap: Long,
    @ColumnInfo( name ="garden_plant_map_garden_map")
    val gardenPlantMap_garden_map: Long,
    @ColumnInfo( name ="garden_plant_map_plant_map")
    val gardenPlantMap_plant_map: Long
)

用于獲取最終查詢的兩個 POJO(替代方案),它具有額外的計算/派生列狀態 Example1POJOExample2POJO :-

data class Example1POJO (
    @Embedded
    val garden: Garden,
    @Embedded
    val visit: Visit,
    @Embedded
    val plant: Plant,
    @Embedded
    val trait: Trait,
    val status: String
)

data class Example2POJO(
    val garden_id: Long,
    val garden_name: String,
    val visit_id: Long,
    val visit_done: Boolean,
    val start_of_visit: String,
    val end_of_visit: String,
    val plant_id: Long,
    val plant_name: String,
    val trait_id: Long,
    val trait_description: String,
    val status: String
)

單個 Dao 抽象類(可以是介面)GardenVisitDao

@Dao
abstract class GardenVisitDao {

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    abstract fun insert(garden: Garden): Long
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    abstract fun insert(plant: Plant): Long
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    abstract fun insert(trait: Trait): Long
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    abstract fun insert(gardenPlantMap: GardenPlantMap): Long /* not really of use */
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    abstract fun insert(visit: Visit): Long
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    abstract fun insert(annotation: Annotation): Long

    @Query("SELECT * FROM garden")
    abstract fun getAllFromGarden(): List<Garden>
    @Query("SELECT garden_id FROM garden WHERE garden_name=:gardenName")
    abstract fun getGardenIdByGardenName(gardenName: String): Long
    @Query("SELECT plant_id FROM plant WHERE plant_name=:plantName")
    abstract fun getPlantIdByPlantName(plantName: String): Long
    @Query("SELECT trait_id FROM trait WHERE trait_description=:traitDescription")
    abstract fun getTraitIdByDescription(traitDescription: String): Long
    @Query("SELECT visit_id FROM visit WHERE start_of_visit=:visitStartDateTime")
    abstract fun getVisitIdByStartDateTime(visitStartDateTime: String): Long

    /*
        SELECT
        garden_name,
        start_of_visit,end_of_visit, visit_done,
        plant.plant_name,
        trait.trait_description,
            CASE WHEN visit_done THEN 'Completed' ELSE 'ToDO' END AS status
        FROM annotation
        JOIN visit ON visit.visit_id = annotation.visit_map
        JOIN garden ON visit.garden_map = garden.garden_id
        JOIN plant ON garden_plant_map_plant_map = plant_id
        JOIN trait ON trait_map = trait_id
        ;
     */

    @Query("SELECT "  
            "garden.*,"  
            "visit.*,"  
            "plant.*,"  
            "trait.*,"  
            "CASE WHEN visit_done THEN 'Completed' ELSE 'ToDO' END AS status"  
            " FROM annotation "  
            "JOIN visit ON visit.visit_id = annotation.visit_map "  
            "JOIN garden ON visit.garden_map = garden.garden_id "  
            "JOIN plant ON annotation.garden_plant_map_plant_map = plant.plant_id "  
            "JOIN trait ON trait.trait_id = annotation.trait_map")
    abstract fun getAllAnnotationsOverviewV1(): List<Example1POJO>


    @Query("SELECT "  
            "garden.*,"  
            "visit.*,"  
            "plant.*,"  
            "trait.*,"  
            "CASE WHEN visit_done THEN 'Completed' ELSE 'ToDO' END AS status"  
            " FROM annotation "  
            "JOIN visit ON visit.visit_id = annotation.visit_map "  
            "JOIN garden ON visit.garden_map = garden.garden_id "  
            "JOIN plant ON annotation.garden_plant_map_plant_map = plant.plant_id "  
            "JOIN trait ON trait.trait_id = annotation.trait_map")
    abstract fun getAllAnnotationsOverviewV2(): List<Example2POJO>
}

@Database 類GardenVisitDatabase

@Database(entities = [
    Garden::class,
    Plant::class,
    Trait::class,
    Visit::class,
    Annotation::class,
    GardenPlantMap::class],
    version = 1
)
abstract class GardenVisitDatabase: RoomDatabase() {
    abstract fun getGardenVisitDao(): GardenVisitDao
    companion object {
        @Volatile
        private var instance: GardenVisitDatabase? = null
        fun getInstance(context: Context): GardenVisitDatabase {
            if (instance == null) {
                instance = Room.databaseBuilder(
                    context,GardenVisitDatabase::class.java,
                    "gardenvisit.db"
                )
                    .allowMainThreadQueries()
                    .build()
            }
            return instance as GardenVisitDatabase
        }
    }
}
  • 注意 allowMainThreadQueries 允許所有(大多數)在主執行緒上運行(有利于測驗)。

最后從復制(接近)答案中的 SQL 的 Activity 加載和提取資料(上一個查詢的兩個版本)。

class MainActivity : AppCompatActivity() {
    lateinit var db: GardenVisitDatabase
    lateinit var dao: GardenVisitDao
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        db = GardenVisitDatabase.getInstance(this)
        dao = db.getGardenVisitDao()

        /*
        INSERT INTO garden (garden_name)
            VALUES('Kew' /* id will be 1 */),('Hanging Gardens of Babylon' /* id will be 2 and so on (probably)*/)
        ;
         */
        val keygardens_id = dao.insert(Garden(name = "Kew"))
        val babylon_id = dao.insert(Garden(name = "hanging Gardens of Babylon"))
        /*
        INSERT INTO plant (plant_name)
            VALUES('Rose' /* id will be 1 etc*/),('Dandelion'),('Poppy'),('Azelia'),('Oak'),('Beech')
        ;
         */
        val rose_id = dao.insert(Plant(name = "Rose"))
        val dand_id = dao.insert(Plant(name = "Dandelion"))
        val popp_id = dao.insert(Plant(name = "Poppy"))
        val azel_id = dao.insert(Plant(name = "Azelia"))
        val oak_id = dao.insert(Plant(name = "Oak"))

        val ww_id = dao.insert(Trait(description = "Well Watered"))
        val dead_id = dao.insert(Trait(description = "Dead"))
        val uw_id = dao.insert(Trait(description = "Under Watered"))
        val str_id = dao.insert(Trait(description = "Stressed"))
        val flour_id = dao.insert(Trait(description = "Flourishing"))

        dao.insert(GardenPlantMap( dao.getGardenIdByGardenName("Kew"),dao.getPlantIdByPlantName("Rose")));
        dao.insert(GardenPlantMap(keygardens_id,popp_id))
        dao.insert(GardenPlantMap(babylon_id,dand_id))
        dao.insert(GardenPlantMap(babylon_id,oak_id))
        dao.insert(GardenPlantMap(babylon_id,dao.insert(Plant(name = "Beech"))))

        val vkew20210101 = dao.insert(Visit(garden_map = keygardens_id, visitStart = "2020-01-01 08:00", visitEnd = "2021-01-01 10:00", visitDone = true))
        val vkew20220101 = dao.insert(Visit(garden_map = keygardens_id, visitStart = "2022-01-01 08:00", visitEnd = "2022-01-01 10:00", visitDone = false))
        val vbab20220201 = dao.insert(Visit(garden_map = babylon_id, visitStart = "2022-02-01 08:00", visitEnd = "2022-02-01 10:00", visitDone = false))
        val vkey20220301 = dao.insert(Visit(garden_map = keygardens_id, visitStart = "2022-03-01 08:00", visitEnd = "2022-03-01 10:00", visitDone = false))
        val vbab20220401 = dao.insert(Visit(garden_map = babylon_id, visitStart = "2022-04-01 08:00", visitEnd = "2022-04-01 10:00", visitDone = false))
        val vkey20220501 = dao.insert(Visit(garden_map = keygardens_id, visitStart = "2022-05-01 08:00", visitEnd = "2022-05-01 10:00", visitDone = false))

        dao.insert(Annotation(visitMap = vkew20210101, traitMap =  ww_id, gardenPlantMap_garden_map = keygardens_id, gardenPlantMap_plant_map = popp_id))
        dao.insert(Annotation(visitMap = vkew20210101, traitMap = uw_id, gardenPlantMap_garden_map = keygardens_id, gardenPlantMap_plant_map = rose_id))
        dao.insert(Annotation(visitMap = vbab20220201, traitMap = dead_id, gardenPlantMap_garden_map = babylon_id, gardenPlantMap_plant_map = dand_id))
        dao.insert(Annotation(visitMap = vbab20220201, traitMap = flour_id, gardenPlantMap_garden_map = babylon_id, gardenPlantMap_plant_map = dao.getPlantIdByPlantName("Beech")))
        dao.insert(Annotation(visitMap = vbab20220201, traitMap = str_id, gardenPlantMap_garden_map = babylon_id, gardenPlantMap_plant_map = oak_id))

        for(ex1: Example1POJO in dao.getAllAnnotationsOverviewV1()) {
            Log.d("GARDENDBINFO","Garden is ${ex1.garden.name} starts: ${ex1.visit.visitStart} ends: ${ex1.visit.visitEnd}. Plant is ${ex1.plant.name}. Trait is ${ex1.trait.description}. Status is ${ex1.status} ")
        }
        for(ex2: Example2POJO in dao.getAllAnnotationsOverviewV2()) {
            Log.d("GARDENDBINFO","Garden is ${ex2.garden_name} starts: ${ex2.start_of_visit} ends: ${ex2.end_of_visit}. Plant is ${ex2.plant_name}. Trait is ${ex2.trait_description}. Status is ${ex2.status} ")

        }
    }
}

結果輸出到日志

40.959D/GARDENDBINFO: Garden is Kew starts: 2020-01-01 08:00 ends: 2021-01-01 10:00. Plant is Poppy. Trait is Well Watered. Status is Completed 
40.959D/GARDENDBINFO: Garden is Kew starts: 2020-01-01 08:00 ends: 2021-01-01 10:00. Plant is Rose. Trait is Under Watered. Status is Completed 
40.960D/GARDENDBINFO: Garden is hanging Gardens of Babylon starts: 2022-02-01 08:00 ends: 2022-02-01 10:00. Plant is Dandelion. Trait is Dead. Status is ToDO 
40.960D/GARDENDBINFO: Garden is hanging Gardens of Babylon starts: 2022-02-01 08:00 ends: 2022-02-01 10:00. Plant is Beech. Trait is Flourishing. Status is ToDO 
40.960D/GARDENDBINFO: Garden is hanging Gardens of Babylon starts: 2022-02-01 08:00 ends: 2022-02-01 10:00. Plant is Oak. Trait is Stressed. Status is ToDO

 
40.962D/GARDENDBINFO: Garden is Kew starts: 2020-01-01 08:00 ends: 2021-01-01 10:00. Plant is Poppy. Trait is Well Watered. Status is Completed 
40.962D/GARDENDBINFO: Garden is Kew starts: 2020-01-01 08:00 ends: 2021-01-01 10:00. Plant is Rose. Trait is Under Watered. Status is Completed 
40.962D/GARDENDBINFO: Garden is hanging Gardens of Babylon starts: 2022-02-01 08:00 ends: 2022-02-01 10:00. Plant is Dandelion. Trait is Dead. Status is ToDO 
40.962D/GARDENDBINFO: Garden is hanging Gardens of Babylon starts: 2022-02-01 08:00 ends: 2022-02-01 10:00. Plant is Beech. Trait is Flourishing. Status is ToDO 
40.962D/GARDENDBINFO: Garden is hanging Gardens of Babylon starts: 2022-02-01 08:00 ends: 2022-02-01 10:00. Plant is Oak. Trait is Stressed. Status is ToDO 

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/398934.html

標籤:安卓工作室 android-room

上一篇:我在使用matplotlib在3D圖形旁邊繪制2D圖形時遇到問題

下一篇:如何在控制臺中列印插入的值?(顫振|sqflite)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more