2012-06-09 30 views
39

Gần đây tôi đã mã hóa một ứng dụng Android. Nó chỉ là một ứng dụng đơn giản cho phép bạn giữ điểm số của một trò chơi bóng rổ với một vài khoảng thời gian truy cập đơn giản. Tôi đang nhận được nhu cầu để thêm một tính năng lưu, vì vậy bạn có thể lưu điểm số của bạn và sau đó tải chúng trở lại. Hiện tại, khi bạn dừng ứng dụng, dữ liệu của bạn bị mất. Vì vậy, những gì tôi đã tự hỏi là những gì tôi sẽ phải thêm để có các ứng dụng lưu một nhãn (điểm số) và sau đó tải nó trở lại. Cảm ơn các bạn xin lỗi tôi không biết nhiều về công cụ này.Cách lưu dữ liệu trong ứng dụng android

Trả lời

4

Sử dụng SharedPreferences, http://developer.android.com/reference/android/content/SharedPreferences.html

Dưới đây là một ví dụ: http://developer.android.com/guide/topics/data/data-storage.html#pref

Nếu cấu trúc dữ liệu phức tạp hơn hoặc dữ liệu quá lớn, sử dụng một cơ sở dữ liệu Sqlite; nhưng đối với một lượng nhỏ dữ liệu và với cấu trúc dữ liệu rất đơn giản, tôi muốn nói, SharedPrefs sẽ làm và một DB có thể ở trên đầu.

+0

Đó là đúng. Sử dụng một cái gì đó phức tạp hơn này chỉ là quá mức cần thiết và một ý tưởng câm. SharedPreferences là tất cả những gì cần thiết. –

1
  1. sở thích chung: android shared preferences example for high scores?

  2. Liệu ứng dụng của bạn có quyền truy cập vào các "bên ngoài lưu trữ Media". Nếu nó sau đó bạn chỉ có thể viết giá trị (lưu trữ nó với dấu thời gian) trong một tập tin và lưu nó. Dấu thời gian sẽ giúp bạn thể hiện sự tiến bộ nếu đó là những gì bạn đang tìm kiếm. {không phải là giải pháp thông minh.}

+2

liên quan đến 2) không cần phải sử dụng bộ nhớ ngoài, mà luôn luôn đòi hỏi một kiểm tra (cho dù một sdcard được gắn kết). Tại sao không chỉ sử dụng bộ nhớ cache hoặc thư mục tệp của ứng dụng? (getFilesDir(), getCacheDir()). –

+0

@MathiasLin bạn nên đăng câu trả lời đầy đủ. – thomasfedb

+0

@thomasfedb Tôi đã đăng câu trả lời đầu tiên cho câu hỏi này, và với các liên kết và mẫu được liên kết, nó phải là tất cả những gì anh ta cần. Bất cứ điều gì tôi bị mất? –

0

Theo tôi, db4o là cách dễ nhất. Ở đây bạn có thể tìm thấy một hướng dẫn: http://community.versant.com/documentation/reference/db4o-7.12/java/tutorial/

Và ở đây bạn có thể tải về thư viện:

http://www.db4o.com/community/download.aspx?file=db4o-8.0-java.zip

(Chỉ cần đặt db4o-8,0 ...- toàn java5.jar trong lib vào thư mục libs của dự án của bạn Nếu không có thư mục libs nào trong dự án bạn tạo nó)

Vì db4o là một hệ thống cơ sở dữ liệu hướng đối tượng, bạn có thể trực tiếp lưu các đối tượng vào cơ sở dữ liệu và sau đó lấy lại chúng.

+0

db4o trông giống như một chút chi phí cho tôi. Nếu ở tất cả, một db sqlite có lẽ sẽ dễ dàng hơn do sự hỗ trợ mà Android mang lại, tuy nhiên với một lượng nhỏ dữ liệu rất cơ bản, tôi muốn nói, SharedPrefs sẽ là đủ. –

+0

Theo tôi, db4o dễ hơn rất nhiều so với sql, đặc biệt là cho người mới bắt đầu. Và ít fiddling hơn với này prefs chia sẻ xấu xí :-) – fivef

+0

một chút off-topic - nhưng ...: Tôi đã nhìn vào db4o thời gian dài trước đây, cho các dự án không Android, và ý tưởng không phải là xấu; những gì tôi không thích về db4o là nó độc quyền. Nếu bạn muốn tránh giao dịch trực tiếp với sql, tôi cũng có thể đề xuất ORMLite làm thư viện ORM (ORM = ánh xạ đối tượng-quan hệ). Tuy nhiên, tôi đoán db4o cũng sẽ làm việc tốt cho công việc như vậy, không có nghi ngờ. –

53

Bạn có hai tùy chọn và tôi sẽ để lại lựa chọn cho bạn.

  1. Preferences Shared

    Đây là một khuôn khổ duy nhất để Android cho phép bạn lưu trữ các giá trị nguyên thủy (như int, boolean,String, mặc dù nói đúng String không phải là một nguyên thủy) trong một Key- khung giá trị. Điều này có nghĩa là bạn đặt tên cho giá trị, nói "homeScore" và lưu giá trị vào khóa này.

    SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putInt("homeScore", YOUR_HOME_SCORE); 
    
    // Apply the edits! 
    editor.apply(); 
    
    // Get from the SharedPreferences 
    SharedPreferences settings = getApplicationContext().getSharedPreferences(PREFS_NAME, 0); 
    int homeScore = settings.getInt("homeScore", 0); 
    
  2. lưu trữ nội bộ

    này, theo ý kiến ​​của tôi, là những gì bạn có thể tìm kiếm. Bạn có thể lưu trữ bất cứ điều gì bạn muốn một tập tin, do đó, điều này mang lại cho bạn sự linh hoạt hơn. Tuy nhiên, quá trình này có thể phức tạp hơn vì mọi thứ sẽ được lưu trữ dưới dạng byte và điều đó có nghĩa là bạn phải cẩn thận để giữ cho các quy trình đọc và viết của bạn hoạt động cùng nhau.

    int homeScore; 
    byte[] homeScoreBytes; 
    
    homeScoreBytes[0] = (byte) homeScore; 
    homeScoreBytes[1] = (byte) (homeScore >> 8); //you can probably skip these two 
    homeScoreBytes[2] = (byte) (homeScore >> 16); //lines, because I've never seen a     
                   //basketball score above 128, it's 
                   //such a rare occurance. 
    
    FileOutputStream outputStream = getApplicationContext().openFileOutput(FILENAME, Context.MODE_PRIVATE); 
    outputStream.write(homeScoreBytes); 
    outputStream.close(); 
    

Bây giờ, bạn cũng có thể nhìn vào External Storage, nhưng tôi không khuyên trong trường hợp đặc biệt này, bởi vì lưu trữ bên ngoài có thể không có mặt ở đó sau này. (Lưu ý rằng nếu bạn chọn tùy chọn này, yêu cầu phải có giấy phép)

+14

LOL - Tôi thích nhận xét đó "bởi vì tôi chưa từng thấy điểm bóng rổ trên 128" :-) btw: để bạn tham khảo: http://www.nba.com/pistons/news/highest_score_071211.html –

+6

Trong Hyrule, người giàu nhất còn sống chỉ có thể có 255 rupee. ;) – Neil

+0

Tôi nghĩ bạn có thể sử dụng sqlite để lưu trữ – monim

10

OP yêu cầu chức năng "lưu", không chỉ bảo toàn dữ liệu qua các lần thực hiện chương trình (mà bạn phải làm cho ứng dụng đáng giá) Bất cứ điều gì.)

Tôi khuyên bạn nên lưu dữ liệu trong một tệp trên sdcard cho phép bạn không chỉ nhớ lại nó sau đó, mà còn cho phép người dùng gắn thiết bị đó dưới dạng ổ đĩa ngoài trên máy tính của họ và lấy dữ liệu để sử dụng ở những nơi khác.

Vì vậy, bạn thực sự cần một hệ thống đa điểm:

1) Triển khai onSaveInstanceState(). Trong phương pháp này, bạn đã vượt qua một Gói, về cơ bản giống như một từ điển. Lưu trữ càng nhiều thông tin trong nhóm càng cần thiết để khởi động lại ứng dụng chính xác vị trí của nó. Trong phương thức onCreate() của bạn, hãy kiểm tra gói được chuyển thành không rỗng và nếu có, hãy khôi phục trạng thái từ gói.

2) Triển khai onPause(). Trong phương pháp này, tạo một trình soạn thảo SharedPreferences và sử dụng nó để lưu bất kỳ trạng thái nào bạn cần để khởi động ứng dụng vào lần sau. Điều này chủ yếu bao gồm sở thích của người dùng (do đó tên), nhưng bất cứ điều gì khác relavent đến tình trạng khởi động của ứng dụng nên đi ở đây là tốt. Tôi sẽ không phải là điểm số cửa hàng tại đây, chỉ là những thứ bạn cần để khởi động lại ứng dụng. Sau đó, trong onCreate(), bất cứ khi nào không có đối tượng bó, hãy sử dụng giao diện SharedPreferences để gọi lại các cài đặt đó.

3a) Đối với những thứ như điểm số, bạn có thể làm theo lời khuyên của Mathias ở trên và lưu trữ điểm số trong thư mục được trả về trong getFilesDir(), sử dụng openFileOutput(), v.v. Tôi nghĩ thư mục này là riêng tư đối với ứng dụng và trong bộ nhớ chính, nghĩa là các ứng dụng khác và người dùng sẽ không thể truy cập dữ liệu. Nếu đó là ok với bạn, thì đây có lẽ là con đường để đi.

3b) Nếu bạn muốn các ứng dụng khác hoặc người dùng có quyền truy cập trực tiếp vào dữ liệu, hoặc nếu dữ liệu sẽ rất lớn, thì sdcard là cách để đi. Chọn tên thư mục như com/user1446371/basketballapp/để tránh xung đột với các ứng dụng khác (trừ khi bạn chắc chắn rằng tên ứng dụng của bạn là duy nhất hợp lý) và tạo thư mục đó trên sdcard. Như Mathias đã chỉ ra, trước tiên bạn phải xác nhận rằng sdcard được gắn kết.

File sdcard = Environment.getExternalStorageDirectory(); 
if(sdcard == null || !sdcard.isDirectory()) { 
    fail("sdcard not available"); 
} 
File datadir = new File(sdcard, "com/user1446371/basketballapp/"); 
if(!datadir.exists() && !datadir.mkdirs()) { 
    fail("unable to create data directory"); 
} 
if(!datadir.isDirectory()) { 
    fail("exists, but is not a directory"); 
} 
// Now use regular java I/O to read and write files to data directory 

Tôi đề xuất tệp CSV đơn giản cho dữ liệu của bạn để các ứng dụng khác có thể đọc chúng dễ dàng.

Rõ ràng, bạn sẽ phải viết các hoạt động cho phép hộp thoại "lưu" và "mở". Tôi thường chỉ thực hiện các cuộc gọi đến trình quản lý tệp openintents và để cho nó thực hiện công việc. Điều này yêu cầu người dùng của bạn cài đặt trình quản lý tệp openintents để sử dụng các tính năng này, tuy nhiên.

+0

Một nhận xét khác: nếu có có thể, làm việc đọc và viết trong một chủ đề khác, đặc biệt là văn bản. Nếu không, ứng dụng của bạn bị đóng băng và người dùng có trải nghiệm ít hơn tối ưu. –

0

Xin đừng quên một điều - Dữ liệu lưu trữ nội bộ sẽ bị xóa khi bạn gỡ cài đặt ứng dụng. Trong một số trường hợp, nó có thể là "tính năng không mong muốn". Sau đó, bạn nên sử dụng bộ nhớ ngoài.

Google docs about storage - Xin hãy nói riêng tại getExternalStoragePublicDirectory

3

Có rất nhiều lựa chọn để lưu trữ dữ liệu của bạn và Android cung cấp cho bạn để chọn ai bạn tùy chọn lưu trữ dữ liệu như sau:

Preferences Shared cửa hàng dữ liệu nguyên thủy riêng tư trong các cặp khóa-giá trị. Bộ nhớ trong Lưu trữ dữ liệu cá nhân trên bộ nhớ thiết bị. Bộ nhớ ngoài Lưu trữ dữ liệu công khai trên bộ nhớ ngoài dùng chung. Cơ sở dữ liệu SQLite Lưu trữ dữ liệu có cấu trúc trong cơ sở dữ liệu riêng tư. Network Connection Lưu trữ dữ liệu trên web với máy chủ mạng riêng bạn

Kiểm tra here cho ví dụ và tuto

7

Trong onCreate:

SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE); 

    String mySetting = sharedPref.getString("mySetting", null); 

Trong onDestroy hoặc tương đương:

SharedPreferences sharedPref = getSharedPreferences("mySettings", MODE_PRIVATE); 

    SharedPreferences.Editor editor = sharedPref.edit(); 
    editor.putString("mySetting", "Hello Android"); 
    editor.commit(); 
Các vấn đề liên quan