2012-06-04 63 views
7

Tôi đang sử dụng phương pháp tiếp cận chuẩn mà tôi đã học được từ ví dụ notepad phổ biến để xây dựng ứng dụng đầu tiên của mình.
Nhưng tôi bị kẹt vào một vấn đề lạ.
Tệp cơ sở dữ liệu SQLite (.db) không được tạo trong/data/data/package/databases. Tôi đã kiểm tra chéo tập tin manifest và tập tin OpenHelper từ dev android HeadFirst. Cuốn sách (Tôi đang sử dụng nó như là một tài liệu tham khảo) nhưng tôi thấy mình không thể tìm ra lý do tại sao các tập tin cơ sở dữ liệu không được tạo ra ..
Có bất kỳ điều khoản đặc biệt hay gì đó chúng ta cần phải bật để làm cho nó hoạt động không ??
điều lạ là làm việc tốt cho các ví dụ được tải sẵn. có nghĩa là tập tin '.db' được tạo ra cho ví dụ notepad nhưng khi tôi thử, nó không thành công. :(
đây là tác phẩm của tôicơ sở dữ liệu sqlite không được tạo

Package -. Database.test

1. AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 

<uses-sdk android:minSdkVersion="10" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".Database_testActivity" 
     android:label="@string/app_name" > 
    </activity> 
</application> 

2.TestOpenHelper.java

package database.test; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class TestOpenHelper extends SQLiteOpenHelper { 

TestOpenHelper(Context context){ 
    super(context,"mydb.db",null,1); 
} 
@Override 
public void onCreate(SQLiteDatabase database){ 
    database.execSQL("create table test_1 " + " (field1 integer primary key, field2 integer);"); 
} 
public void onUpgrade (SQLiteDatabase database, int oldVersion, int newVersion){ 
    database.execSQL("drop table if exists test1"); 
    onCreate(database); 
} 
} 

3.Database_testActivity.java

package database.test; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ListView; 

public class Database_testActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ListView listview = (ListView)findViewById(R.id.test_list); 
    TestAdapter ta = new TestAdapter(); 
    listview.setAdapter(ta); 

    TestOpenHelper openHelper = new TestOpenHelper(this); 
} 
} 

Tôi biết nó là một câu hỏi rất cơ bản, nhưng tôi đã cố gắng để giải quyết việc này trong vòng mười lăm ngày qua và bây giờ tôi hoàn toàn thất vọng.
Xin giúp ..

+1

Bạn nên sử dụng 'Đăng nhập' ở những nơi khác nhau và theo dõi 'logcat' để theo dõi những gì đang diễn ra. Ngoài ra tôi có thể sai nhưng bạn đã thử sử dụng "mydb" cho tên db trong constructor 'TestOpenHelper'? Như tôi đã nói, tôi có thể sai nhưng tôi không thể không cảm thấy việc sử dụng đuôi tệp (như trong "mydb.db") có thể gây ra sự cố. – Squonk

+0

bạn có thể ném một số ánh sáng vào 'sử dụng Nhật ký'. Tôi đã thử nhiều tên nhưng không có gì xảy ra cả. cảm ơn bạn – Bond

+0

cũng mọi ứng dụng. trong/data/data bắt đầu bằng com.android.something nhưng không. nó có thể là lý do của vấn đề của tôi? – Bond

Trả lời

22

Thay đổi này:

database.execSQL("create table test_1 " + " (field1 integer primary key, field2 integer)"); 

và điều này TestOpenHelper openHelper = new TestOpenHelper(this); thay đổi SQLiteDatabase db = new TestOpenHelper(this).getWritableDatabase();

Bạn cơ sở dữ liệu thực sự không tạo, bạn chỉ tạo ra thể hiện của SQLiteOpenHelper của bạn nhưng đối với tạo hoặc mở cơ sở dữ liệu bạn phải sử dụng phương thức getWritableDatabase() hoặc getReadableDatabase().

Chính xác từ tài liệu:

Tạo và/hoặc mở một cơ sở dữ liệu sẽ được sử dụng để đọc và bằng văn bản.

+0

wow .. mà làm việc. Cảm ơn nhiều. – Bond

+3

+1 - Bị bắt. Tôi đã không phát hiện ra rằng không phải 'getWritableDatabase()' hoặc 'getReadableDatabase()' đã được gọi. – Squonk

+0

mã của bạn không hoạt động vì bạn không bao giờ tạo cơ sở dữ liệu, bạn chỉ tạo cá thể của người dùng SQLiteOpenHelper :-) để tạo cơ sở dữ liệu, bạn phải gọi phương thức getWritableDatabase() 'hoặc' getReadableDatabase() 'để tạo/mở cơ sở dữ liệu của bạn. khi cơ sở dữ liệu của bạn đã được tạo, vì vậy phương thức này sẽ luôn luôn chỉ mở cơ sở dữ liệu của bạn. – Sajmon

Các vấn đề liên quan