ข้อดีข้อเสียของการตั้งค่าแบบ SQLite และการใช้ร่วมกัน [ปิด]


156

กลไกที่ดีในการจัดเก็บข้อมูลระหว่างฐานข้อมูล SQLite และการตั้งค่าที่ใช้ร่วมกันคืออะไร?

เหตุใดจึงใช้การตั้งค่าที่ใช้ร่วมกัน ทำไมต้องใช้ sqlite ฉันพยายามค้นหาความแตกต่างระหว่างพวกเขาและนี่เป็นกลไกที่ดีกว่าสำหรับการจัดเก็บข้อมูล แต่ฉันไม่สามารถหาคำตอบที่เหมาะสมใน Google โปรดช่วยฉันด้วยตัวอย่างและคำอธิบาย


มันสวยมากขึ้นอยู่กับประเภทของข้อมูลที่คุณต้องการจัดเก็บ SharedPreferences ช่วยให้เข้าถึงข้อมูลได้ง่ายและรวดเร็วยิ่งขึ้นสะดวกสบายในการใช้งานเมื่อรักษาข้อมูลจำนวนเล็กน้อย
Egor

2
อย่าเก็บสิ่งใดไว้ในการตั้งค่าที่ใช้ร่วมกันยกเว้นสตริงแบบธรรมดาและแบบดั้งเดิม - และหากคุณใช้ไฟล์แยกต่างหากสำหรับแต่ละไฟล์ - แม้ว่าการตั้งค่าที่ใช้ร่วมกันของเอกสารจะไม่ปลอดภัยสำหรับเธรดและแม้ว่าจะใช้เพียงอย่างเดียว มีค่าคีย์มากกว่า 1 คู่ในไฟล์
RunLoop

SharedPreferences ถูกแคชในหน่วยความจำหลังจากการใช้ครั้งแรกดังนั้นพวกเขาควรจะค่อนข้างเร็วในการใช้การอ่านที่ตามมา
สแตน

คำตอบ:


169

ขึ้นอยู่กับข้อมูลที่คุณต้องการจัดเก็บ

SQLite

ข้อมูลโครงสร้างเดียวกันจำนวนมากควรเก็บไว้ในฐานข้อมูล SQLite เนื่องจากฐานข้อมูลได้รับการออกแบบสำหรับข้อมูลประเภทนี้ เนื่องจากข้อมูลมีโครงสร้างและจัดการโดยฐานข้อมูลจึงสามารถสอบถามเพื่อรับชุดย่อยของข้อมูลที่ตรงกับเกณฑ์บางอย่างโดยใช้ภาษาแบบสอบถามเช่น SQL ทำให้สามารถค้นหาข้อมูลได้ แน่นอนว่าการจัดการและค้นหาชุดข้อมูลขนาดใหญ่มีอิทธิพลต่อประสิทธิภาพดังนั้นการอ่านข้อมูลจากฐานข้อมูลอาจช้ากว่าการอ่านข้อมูลจาก SharedPreferences

SharedPreferences

SharedPreferences เป็นที่เก็บคีย์ / ค่าที่คุณสามารถบันทึกข้อมูลภายใต้คีย์ที่แน่นอน หากต้องการอ่านข้อมูลจากร้านค้าคุณต้องรู้กุญแจของข้อมูล ทำให้การอ่านข้อมูลเป็นเรื่องง่าย แต่ง่ายเหมือนการเก็บข้อมูลจำนวนเล็กน้อยยากที่จะเก็บและอ่านข้อมูลที่มีโครงสร้างขนาดใหญ่ตามที่คุณต้องการกำหนดคีย์สำหรับทุกข้อมูลเดียวและคุณไม่สามารถค้นหาข้อมูลได้ยกเว้นคุณมีแนวคิดบางอย่างสำหรับ การตั้งชื่อกุญแจ


24
เพื่อยกตัวอย่าง SharedPreferences นั้นมีประโยชน์สำหรับการจัดเก็บค่ากำหนดของผู้ใช้ซึ่งมีเพียงไม่กี่ตัวแปรที่ต้องจัดเก็บ ในทางกลับกัน SQLite จะดีกว่าสำหรับการจัดเก็บข้อมูลที่มีรายการจำนวนมากเช่นชื่อเพลงในคลังเพลงที่ต้องค้นหา
CL22

5
คุณไม่จำเป็นต้องรู้ชื่อคีย์เพื่อใช้ SharedPreferences ดูที่ getAll ()
ZaBlanc

5
FYI มีตัวเลือกที่สามคืออ่าน / เขียน XML ลงในไฟล์ (ดูคลาส android.util.xml) เหมาะสำหรับข้อมูลที่มีความซับซ้อนปานกลางซึ่งสามารถอ่าน / เขียนทั้งหมดได้ในครั้งเดียว ตัวอย่างเช่นตารางค่าที่ผู้ใช้ไม่เปลี่ยนแปลงบ่อย โดยเฉพาะอย่างยิ่งถ้าเป็นข้อมูลที่คุณอาจต้องการส่งไปที่อื่นในภายหลังดังนั้นจะต้องอยู่ในรูปแบบที่แยกวิเคราะห์ได้
ToolmakerSteve

1
จะแนะนำให้บันทึก json เป็นสตริง json ใน pref ที่ใช้ร่วมกันหรือไม่
Kaveesh Kanwal

2
@JCarlos ตราบใดที่คุณไม่ได้ทำสิ่งที่ข้ามกระบวนการคุณจะไม่เป็นไรโดยใช้ SharedPreferences
Mygod

97

คำถามนี้มีคำตอบที่ยอมรับได้ แต่ฉันคิดว่ามีอีกมากที่จะพูดในหัวข้อ - เกี่ยวกับความเร็ว

SharedPreferences ของแอปพลิเคชันและ DBlite DB เป็นทั้งไฟล์เพียงเก็บไว้ในไดเรกทอรีของแอปพลิเคชันบนระบบไฟล์ของอุปกรณ์ หากจำนวนข้อมูลไม่ใหญ่เกินไปตัวเลือก Sqlite จะเกี่ยวข้องกับไฟล์ที่มีขนาดใหญ่ขึ้นและซับซ้อนมากขึ้นโดยมีค่าใช้จ่ายในการประมวลผลมากขึ้นสำหรับการเข้าถึงง่าย

ดังนั้นหากลักษณะของข้อมูลไม่ได้กำหนดตัวเลือกของคุณ (ดังที่อธิบายไว้ในคำตอบที่ยอมรับ) และเรื่องความเร็วคุณอาจใช้ SharedPreferences ได้ดีกว่า

และการอ่านข้อมูลบางอย่างนั้นมักจะอยู่บนเส้นทางวิกฤติเพื่อแสดงกิจกรรมหลักดังนั้นฉันคิดว่าความเร็วนั้นสำคัญมาก

หนึ่งความคิดสุดท้ายเกี่ยวกับความเร็วและประสิทธิภาพ - ถ้าคุณต้องการใช้ฐานข้อมูล Sqlite สำหรับข้อมูลที่มีโครงสร้างบางอย่างดังนั้นมันอาจจะมีประสิทธิภาพมากกว่าที่จะเก็บการตั้งค่าของผู้ใช้ในฐานข้อมูลเพื่อที่คุณจะไม่เปิดไฟล์ที่สอง นี่เป็นการพิจารณาเล็กน้อย - น่าพิจารณาเมื่อคุณจำเป็นต้องเข้าถึงข้อมูลที่มีโครงสร้างและการกำหนดลักษณะก่อนที่คุณจะสามารถแสดงกิจกรรมหลัก


6
สิ่งที่เกี่ยวกับการอ่านรหัส? ฉันคิดว่าเมื่อจัดเก็บหลายระเบียนใน SharedPrefs แทนที่จะเป็นตาราง db รหัสจะซับซ้อน ไวยากรณ์ของ SQL ง่ายต่อการอ่านมากกว่าการวนลูปมากกว่ารายการ SharedPrefs ...
IgorGanapolsky

8
อิกอร์ฉันไม่เห็นด้วย SharedPreferences นั้นมีขนาด 1 มิติจริงๆแล้วมันตรงไปตรงมามากที่จะใช้ค่ากำหนด ตัวอย่างเช่นฉันกำลังสร้างแอปตรวจสอบสต็อกฉันเพียงแค่เก็บสัญลักษณ์หุ้นไว้ในการตั้งค่า ฉันไม่จำเป็นต้องคว้าพวกเขาเป็นรายบุคคลเพราะฉันมักจะเขียนรายการพวกเขาทั้งหมดและนี่คือทั้งหมดที่ฉันทำเก็บหรือคว้า มันง่ายมากง่ายกว่าการใช้ฐานข้อมูล
AutoM8R

1
ฉันไม่สามารถคิดถึงสถานการณ์ที่การอ่านรหัสได้ยากในขณะที่โครงสร้างของข้อมูลที่จะบันทึกไม่ต้องการใช้ฐานข้อมูลแบบลำดับชั้น แม้ว่าจะมีปัญหาการอ่านใด ๆ ก็สามารถแก้ไขได้โดยใช้คลาส wrapper กับฟังก์ชั่นที่จำเป็น
Sarath Sadasivan Pillai

1
เราสามารถจัดเก็บคีย์ - ค่าหลายค่าในรูปแบบของข้อมูล jsonstring ภายใต้การตั้งค่าที่แชร์ได้หรือไม่? มีการ จำกัด จำนวนอักขระซึ่งอาจตัดค่า json ของฉันหรือไม่
โนวา

2
SharedPreferences ถูกโหลดเข้าสู่หน่วยความจำเพียงครั้งเดียว (ต่อวงจรชีวิตกระบวนการแอป) และเก็บไว้ที่นั่น; หลังจากนั้นมันก็เร็วสุด ๆ เสมอ ดังนั้นจึงไม่มีประสิทธิภาพในทางปฏิบัติใด ๆ ชนะโดยการใส่ข้อมูล SharedPref ลงใน SQLite (เพื่อหลีกเลี่ยงการเข้าถึงไฟล์ SharedPref พิเศษเพิ่มเติม) และโดยวิธีที่คุณไม่ควรใส่ข้อมูล SQLite ลงใน SharedPrefs อย่างที่ฉันบอกไว้มันมักจะอยู่ในหน่วยความจำซึ่งอาจทำให้คุณมีปัญหา (หน่วยความจำไม่เพียงพอ)
Zsolt Safrany

20

สิ่งที่ฉันใช้คือมันไม่ได้เกี่ยวกับความเร็วหรือขนาด แต่ประเภทของการดำเนินการที่คุณต้องการทำกับข้อมูลของคุณ

ถ้าคุณวางแผนที่จะเข้าร่วม , การจัดเรียง , และการดำเนินงานอื่น ๆ DBกับข้อมูลของคุณไปแล้วสำหรับSqlite Sqliteตัวอย่างกำลังเรียงลำดับข้อมูลตามวันที่

หากคุณต้องการแมปค่าง่าย ๆ (เช่น int, บูลีน, สตริง) ให้ใช้การตั้งค่าการตั้งค่าการทำงานของฐานข้อมูลจะไม่ทำงานที่นี่และไม่จำเป็นต้องบอกว่าคุณต้องมีกุญแจทั้งหมด ตัวอย่างคือรหัสผ่านผู้ใช้หรือการกำหนดค่าแอพ

สิ่งล่อใจครั้งใหญ่ที่จะโอบกอดการตั้งค่าคือเมื่อคุณต้องการที่จะใช้ในการจัดเก็บ POJO แบน (วัตถุ JSON ต่อเนื่อง) เป็นสตริง การมีความต้องการเช่นนี้เป็นสัญญาณที่ใช้ sqlite ทำไม เพราะข้อมูลที่ซับซ้อนจะต้องมีความซับซ้อนในที่สุด ลองนึกภาพการดึงข้อมูลเฉพาะซึ่งสามารถจัดการได้โดย "SELECT ... WHERE id = 1" ในเส้นทางการตั้งค่าสิ่งนี้จะเป็นกระบวนการที่ยาวนานจากการทำการดีซีเรียลไลซ์สู่การวนซ้ำผลลัพธ์


SharedPreferences ไม่รองรับการทำธุรกรรมดังนั้นหากคุณต้องการธุรกรรมให้ใช้ SQLite ตัวอย่างเช่นหากผู้ใช้กดปุ่ม "ออกจากระบบ" คุณอาจต้องการล้างSharedPreferencesคีย์ / ค่าหลายรายการพร้อมกัน (เช่นทั้งuserและpasswordปุ่ม) เพื่อให้คุณมั่นใจว่าทั้งสองคีย์นั้นไม่มีการตั้งค่าหรือตั้งค่าทั้งสองอย่าง
runeks

5
  • สำหรับการจัดเก็บข้อมูลจำนวนมากให้ไปที่ระบบฐานข้อมูล SQLite วิธีนี้จะทำให้ผู้ใช้สามารถค้นหาข้อมูลได้เช่นกัน

  • ในทางกลับกันสำหรับการจัดเก็บข้อมูลจำนวนเล็กน้อยให้ไปที่การตั้งค่าที่ใช้ร่วมกัน ในกรณีนี้ระบบฐานข้อมูลขนาดใหญ่ไม่จำเป็น วิธีนี้จะช่วยให้ผู้ใช้สามารถบันทึกข้อมูลและโหลดได้


1
300 คู่ของคีย์ - ค่าคือข้อมูลจำนวนมหาศาล? ฉันต้องการเก็บมันไว้อย่างแน่นอน
JCarlosR

1
ในกรณีนี้คุณควรไปสำหรับฐานข้อมูล SQLite มิฉะนั้นจะยากที่จะจัดการและดึงข้อมูล 300 เหล่านั้น
Sami Al-Jabar

แต่ถ้ารู้จักทุกคีย์จะไม่ง่ายกว่าที่จะดึงข้อมูลจากการตั้งค่าที่ใช้ร่วมกัน?
Arjun

-6

ลืม SQLLite ลืม SharedPreferences ให้ใช้ Realm ทางออกเดียวสำหรับพื้นที่เก็บข้อมูลในเครื่องทั้งหมดของคุณ คุณสามารถใช้ Java Objects ธรรมดาธรรมดาเป็น RealmObjects และเก็บข้อมูลของคุณที่นั่น คุณสามารถแปลงแบบสอบถามที่เลือกไว้เป็นไฟล์ JSON ไม่จำเป็นต้องแยกวิเคราะห์ฐานข้อมูลทั้งหมด ตรวจสอบลิงค์นี้: https://realm.io/news/introducing-realm/


12
ลืมทุกสิ่งที่คุณรู้เกี่ยวกับ slipcovers
Andrew G
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.