рдХрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 7 рдХрджрдоред рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдХрдорд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рднреНрдпрд╛рд╕

рдХрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 7 рдХрджрдоред рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рдХрдорд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рднреНрдпрд╛рд╕


рдХрдорд░рд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ Android рдХреЗ рд╡рд╛рд╕реНрддреБ рдШрдЯрдХреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ SQLiteDatabase рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ, рдорд╛рдирдХ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ SQL рдХреНрд╡реЗрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред


рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ Android рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SQLite рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХрдорд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреИрд╕реЗ рд▓реЗрдирд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ 7 рд╕рд░рд▓ рдЪрд░рдгреЛрдВ рдореЗрдВ рд░реВрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдлрд▓реЗрдХреНрдЯрд░ рдХрд░рдирд╛ рд╣реИред


TL; DR: рдЧреНрд░реЗрдб рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░реЗрдВ, рдЕрдкрдиреА рд╕рдВрд╕реНрдерд╛рдПрдВ, DAO рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдВ, SQLiteDatabase рдХреЙрд▓ рдХреЛ DAO рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдЧрдП рд╕рднреА рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред рд╡рд╣ рд╕рдм рд╣реИ!

рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдирдореВрдирд╛ рдЖрд╡реЗрджрди рдореЗрдВ , рд╣рдо рдЯрд╛рдЗрдк User рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╣рдордиреЗ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛-рд╕реНрддрд░реАрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рдж рд╕реНрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:


  1. sqlite - SQLiteOpenHelper рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ SQLite рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
  2. рдХрдорд░рд╛ - рдХрдорд░реЗ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╡рд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдПрдХ рд╣реА рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ UserRepository рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП UserRepository рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рд╕рд╛рдЗрдХреНрд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рдмрд╣реБрдд рд╕реЗ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдЬреЛ рдЕрдХреНрд╕рд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ UsersDbHelper рдФрд░ LocalUserDataSource рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ LocalUserDataSource ред ContentValues рдХрд╛ ContentValues рдХрд░рдХреЗ рдХреНрд╡реЗрд░реАрдЬрд╝ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ Cursor рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдХреЙрд▓рдо рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓рдо рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдХреЛрдб рдирд┐рд╣рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд┐рд╕реА рдХреЙрд▓рдо рдХреЛ рдХреНрд╡реЗрд░реА рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХрдорд░рд╛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдо рдмрд╕ рд╡рд░реНрдЧрд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред


рдЪрд░рдг 1. рдврд╛рд▓ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛


рдХрдХреНрд╖ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдирдП Google рдорд╛рд╡реЗрди рднрдВрдбрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдмрд╕ рдЗрд╕реЗ рдЕрдкрдиреА рдореБрдЦреНрдп build.gradle рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:


 allprojects { repositories { google() jcenter() } } 

рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░реВрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрд▓реНрдлрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░ рдкреГрд╖реНрдареЛрдВ рдкрд░ рд╕рдВрд╕реНрдХрд░рдг рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдмрдиреЗ рд░рд╣реЗрдВ:


 ext { roomVersion = '2.1.0-alpha03' } 

рдЕрдкрдиреЗ app/build.gradle рдХрдХреНрд╖ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ:


 dependencies { implementation тАЬandroid.arch.persistence.room:runtime:$rootProject.roomVersionтАЭ annotationProcessor тАЬandroid.arch.persistence.room:compiler:$rootProject.roomVersionтАЭ androidTestImplementation тАЬandroid.arch.persistence.room:testing:$rootProject.roomVersionтАЭ } 

рдХрдХреНрд╖ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреНрд▓рд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рд╣рдореЗрдВ рд╕реНрдХреАрдорд╛ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, app/build.gradle рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:


 android { defaultConfig { ... // used by Room, to test migrations javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] } } } // used by Room, to test migrations sourceSets { androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) } ... 

рдЪрд░рдг 2. рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдирд╛


рдХрдХреНрд╖ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ @ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред рдХрдХреНрд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реНрддрдВрднреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рдирддреАрдЬрддрди, рдЗрдХрд╛рдИ рд╡рд░реНрдЧ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдореЙрдбрд▓ рдХреЗ рдЫреЛрдЯреЗ рд╡рд░реНрдЧ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░рд╛ User рд╡рд░реНрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рддреЛ, рдЪрд▓рд┐рдП рдЗрд╕реЗ рдХрдХреНрд╖ рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:


  • @Entity рд╕рд╛рде рд╡рд░реНрдЧ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЯреЗрдмрд▓ рдХрд╛ рдирд╛рдо рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @Entity рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
  • рд╕рд╣реА рдлрд╝реАрд▓реНрдб рдореЗрдВ @PrimaryKey рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рдХрд░ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рд╕реЗрдЯ рдХрд░реЗрдВ - рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рд╣реИред
  • @ColumnInfo(name = "column_name") рдПрдиреЛрдЯреЗрд╢рди @ColumnInfo(name = "column_name") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдЖрдк рдЗрд╕ рдЪрд░рдг рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХреЗ рдЦреЗрддреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдпрджрд┐ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХрдИ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИрдВ, рддреЛ @Ignore рдПрдиреЛрдЯреЗрд╢рди @Ignore рдмрддрд╛рдПрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдХрдорд░рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХреМрди рд╕рд╛ рдирд╣реАрдВред

 @Entity(tableName = "users") public class User { @PrimaryKey @ColumnInfo(name = "userid") private String mId; @ColumnInfo(name = "username") private String mUserName; @ColumnInfo(name = "last_update") private Date mDate; @Ignore public User(String userName) { mId = UUID.randomUUID().toString(); mUserName = userName; mDate = new Date(System.currentTimeMillis()); } public User(String id, String userName, Date date) { this.mId = id; this.mUserName = userName; this.mDate = date; } ... } 

рдиреЛрдЯ: рд╕реБрдЪрд╛рд░реВ рдкреНрд░рд╡рд╛рд╕ рдХреЗ рд▓рд┐рдП, рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдкрд░ рдкреВрд░рд╛ рдзреНрдпрд╛рди рджреЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдЙрдиреНрд╣реЗрдВ @Entity рдФрд░ @ColumnInfo рдореЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред


рдЪрд░рдг 3. рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ (DAO)


рдбреАрдПрдУ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рд╣рдорд╛рд░реЗ SQLite рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ LocalUserDataSource рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ LocalUserDataSource , рдЬрд╣рд╛рдВ рд╣рдордиреЗ Cursor рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ред рдХрдХреНрд╖ рдореЗрдВ, рд╣рдореЗрдВ рдХрд░реНрд╕рд░ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╣рдо UserDao рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рддреЗ рд╕рдордп, рдХрдХреНрд╖ рд╕рднреА "рдХрдбрд╝реА рдореЗрд╣рдирдд" рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдмрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 @Query(тАЬSELECT * FROM UsersтАЭ) List<User> getUsers(); 

рдЪрд░рдг 4. рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдирд╛


рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдкрдиреА Users рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЕрднреА рддрдХ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИ рдЬреЛ рдХрдХреНрд╖ рдХреЗ рдЗрди рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ RoomDatabase рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд RoomDatabase ред рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ @Database рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ @Database , рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдбреАрдПрдУ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдореВрд▓ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 1 рд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ 2 рд╣реЛрдЧрд╛ред


 @Database(entities = {User.class}, version = 2) @TypeConverters(DateConverter.class) public abstract class UsersDatabase extends RoomDatabase { private static UsersDatabase INSTANCE; public abstract UserDao userDao(); 

рдЪреВрдВрдХрд┐ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ Migration рдХреНрд▓рд╛рд╕ рдХреЛ рдпрд╣ рдмрддрд╛рдХрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрдорд░рд╛ 1 рд╕реЗ 2 рддрдХ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪреВрдВрдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рд╣рдо рдмрд╕ рдПрдХ рдЦрд╛рд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:


 static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { //     ,      . } }; 

рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╛рдо рдФрд░ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ:


 database = Room.databaseBuilder(context.getApplicationContext(), UsersDatabase.class, "Sample.db") .addMigrations(MIGRATION_1_2) .build(); 

рдбреЗрдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╡реЗ рд╣реБрдб рдХреЗ рддрд╣рдд рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рджреЗрдЦреЗрдВ ред


рдЪрд░рдг 5. рдХрдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрдВрдбрд╛рд░ рдХрд╛ рдЕрджреНрдпрддрди рдХрд░рдирд╛


рд╣рдордиреЗ рдЕрдкрдирд╛ рдбреЗрдЯрд╛рдмреЗрд╕, рдЕрдкрдиреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдХреНрд╡реЗрд░реА рдмрдирд╛рдИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдо UserDao рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UserDao рд╡рд░реНрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ: Context рд╣рдЯрд╛ рджреЗрдВ рдФрд░ UserDao рдЬреЛрдбрд╝реЗрдВред рдмреЗрд╢рдХ, рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдЬреЛ LocalUserDataSource рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ, рдЙрд╕реЗ рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо LocalUserDataSource рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ рдЬреЛ LocalUserDataSource рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╢реНрди рдмрдирд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдЕрдм рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддреА рд╣реИ рд╡рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:


 public List<User> getUsers() { return mUserDao.getUsers(); } 

рдФрд░ рдЕрдм рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдЬреЛ рд╣рдордиреЗ рдХрд┐рдпрд╛ред


рдХрдХреНрд╖ рдХреА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛:


 java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time. 

рдореБрдЦреНрдп рдереНрд░реЗрдб рд╕реЗ I / O рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХрд╛ рдПрдХ рдирдпрд╛ Runnable рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдереНрд░реЗрдб рдмрдирд╛рдПрдЧрд╛ред рдЪреВрдБрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдЗрдХреНрд▓рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред


рдЪрд░рдг 6. рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг


рд╣рдордиреЗ рдирдИ рдХрдХреНрд╖рд╛рдПрдВ UserDao - UserDao рдФрд░ UsersDatabase рдФрд░ рдХрдХреНрд╖ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ LocalUserDataSource рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдЕрдм рд╣рдореЗрдВ рдЙрдирдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдбреЙ


UserDao рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ AndroidJUnit4 рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрдХреНрд╖ рдХреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рд╕рдлрд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред


 @Before public void initDb() throws Exception { mDatabase = Room.inMemoryDatabaseBuilder( InstrumentationRegistry.getContext(), UsersDatabase.class) .build(); } 

рд╣рдореЗрдВ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВред


 @After public void closeDb() throws Exception { mDatabase.close(); } 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓реЙрдЧрд┐рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


 @Test public void insertAndGetUser() { //      mDatabase.userDao().insertUser(USER); //        List<User> users = mDatabase.userDao().getUsers(); assertThat(users.size(), is(1)); User dbUser = users.get(0); assertEquals(dbUser.getId(), USER.getId()); assertEquals(dbUser.getUserName(), USER.getUserName()); } 

LocalUserDataSource рдореЗрдВ UserDao рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг


рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ LocalUserDataSource рдЕрднреА рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рдЬреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдВ, UserDao рд╕реЗ рдПрдХ UserDao рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ LocalUserDataSource рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред


 @Before public void initDb() throws Exception { mDatabase = Room.inMemoryDatabaseBuilder( InstrumentationRegistry.getContext(), UsersDatabase.class) .build(); mDataSource = new LocalUserDataSource(mDatabase.userDao()); } 

рдлрд┐рд░, рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВред


рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╡рд╛рд╕рди рдкрд░реАрдХреНрд╖рдг


рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЯреЗрд╕реНрдЯ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде MigrationTestHelper рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдк рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрджрд╛рд╣рд░рдг рд╕реЗ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рдЪрд░рдг 7. рд╕рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛ рд╣рдЯрд╛рдирд╛


рдХрд┐рд╕реА рднреА рдЕрдкреНрд░рдпреБрдХреНрдд рд╡рд░реНрдЧ рдФрд░ рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдЬреЛ рдЕрдм рдХрдХреНрд╖ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ UsersDbHelper рдХреНрд▓рд╛рд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ SQLiteOpenHelper рдХреНрд▓рд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ред


рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реИ, рдФрд░ рдЖрдк рдзреАрд░реЗ-рдзреАрд░реЗ рд░реВрдо рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред


рдЕрдм рдорд╛рдирдХ рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХрдо рд╣реЛ рдЧрдИ рд╣реИ, рдЕрдиреБрд░реЛрдз рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдЬрд╛рдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 7 рд╕рд░рд▓ рдЪрд░рдгреЛрдВ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░реВрдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдЖрдк рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЖрд╡реЗрджрди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi441934/


All Articles