2011-09-23 29 views
11

Tôi đang viết một cơ sở dữ liệu trong ứng dụng android của mình, nhưng các bảng của tôi không được tạo. Tôi đã thêm các điểm ngắt tại phương thức onCreate của tôi, và getWriteableDatabase của tôi, và getWritableDatabase được gọi, nhưng onCreate thì không.onCreate() không được gọi bởi getWritableDatabase()

package com.fslade.app; 

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

public class DatabaseHelper extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "applicationdata"; 
    private static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_TABLE = "peopleT"; 

    // Database creation sql statement 
    private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + " (_id integer primary key autoincrement, " 
      + "company_name text not null, name text not null, city text not null, vertical text not null, title text not null, email text not null, bio text not null, photo text not null, status text not null);"; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Method is called during creation of the database 
    @Override 
    public void onCreate(SQLiteDatabase database) { 
     database.execSQL(DATABASE_CREATE); 
    } 

    // Method is called during an upgrade of the database, e.g. if you increase 
    // the database version 
    @Override 
    public void onUpgrade(SQLiteDatabase database, int oldVersion, 
      int newVersion) { 
     Log.w(DatabaseHelper.class.getName(), 
       "Upgrading database from version " + oldVersion + " to " 
         + newVersion + ", which will destroy all old data"); 
     database.execSQL("DROP TABLE IF EXISTS todo"); 
     onCreate(database); 
    } 
} 

Và trong helper cơ sở dữ liệu của tôi, tôi gọi getWriteableDatabse():

package com.fslade.app; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 

public class ContentStorageHelper { 
    public static final String KEY_ID = "_id"; 
    public static final String KEY_COMPANY_NAME = "company_name"; 
    public static final String KEY_PERSON_NAME = "name"; 
    public static final String KEY_CITY = "city"; 
    public static final String KEY_VERTICAL = "vertical"; 
    public static final String KEY_TITLE = "title"; 
    public static final String KEY_EMAIL = "email"; 
    public static final String KEY_BIO = "bio"; 
    public static final String KEY_PHOTO = "photo"; 
    public static final String KEY_STATUS = "status"; 

    private static final String[] COLUMNS = { KEY_ID, KEY_COMPANY_NAME, 
      KEY_PERSON_NAME, KEY_CITY, KEY_VERTICAL, KEY_TITLE, KEY_EMAIL, 
      KEY_BIO, KEY_PHOTO, KEY_STATUS }; 

    private Context context; 
    private SQLiteDatabase database; 
    private DatabaseHelper dbHelper; 

    public ContentStorageHelper(Context context) { 
     this.context = context; 
    } 

    public ContentStorageHelper open() throws SQLException { 
     dbHelper = new DatabaseHelper(context); 
     database = dbHelper.getWritableDatabase(); 
     // dbHelper.onCreate(database); 
// I added this onCreate() to see if it helped, but when I ran it 
// it said that the database had already been created 
     return this; 
    } 

    public void close() { 
     dbHelper.close(); 
    } 

/** 
* Create a new person If the person is successfully created return the new 
* rowId for that person, otherwise return a -1 to indicate failure. 
*/ 
public long createPerson(String company_name, String name, String city, 
     String vertical, String title, String email, String bio, 
     String photo, String status) { 
    ContentValues initialValues = createContentValues(company_name, name, 
      city, vertical, title, email, bio, photo, status); 

    return database.insert(DatabaseHelper.DATABASE_TABLE, null, 
      initialValues); 
} 

/** 
* Return a Cursor over the list of all people in the database 
* 
* @return Cursor over all notes 
*/ 
public Cursor fetchPeopleByVertical(String vertical) { 
    String selection = KEY_VERTICAL+"="+vertical; 
     Cursor result = database.query(DatabaseHelper.DATABASE_TABLE, COLUMNS, 
       selection, null, null, null, null); 
     return result; 
    } 

    private ContentValues createContentValues(String company_name, String name, 
      String city, String vertical, String title, String email, 
      String bio, String photo, String status) { 
     ContentValues values = new ContentValues(); 
     values.put(KEY_COMPANY_NAME, company_name); 
     values.put(KEY_PERSON_NAME, name); 
     values.put(KEY_CITY, city); 
     values.put(KEY_VERTICAL, vertical); 
     values.put(KEY_TITLE, title); 
     values.put(KEY_EMAIL, email); 
     values.put(KEY_BIO, bio); 
     values.put(KEY_PHOTO, photo); 
     values.put(KEY_STATUS, status); 
     System.out.print("test: " + status); 
     return values; 
    } 
} 
+1

Có thể trùng lặp với phương thức [Android SQLiteOpenHelper: onCreate() không được gọi. Tại sao?] (Http://stackoverflow.com/questions/6791852/android-sqliteopenhelper-oncreate-method-is-not-called-why) – Machavity

Trả lời

18

Việc tạo ra chỉ xảy ra một lần (đó là toàn bộ ý nghĩa của một helper cơ sở dữ liệu).

Bạn đã kiểm tra xem liệu cơ sở dữ liệu của mình đã được tạo chưa? Nó nằm ở số /data/data/your.package.name/databases/dbname.

Nếu bạn xóa dữ liệu ứng dụng của bạn trong phần cài đặt ứng dụng android, onCreate của bạn nên được gọi là một lần nữa ...

+0

Đây chính xác là vấn đề. Tôi đã chạy onCreate trước đó trong phát triển, nhưng với một sql sql tạo ra lệnh. Làm cách nào để xóa các cài đặt ứng dụng trong Eclipse? – Francesca

+0

Tôi không hiểu tại sao bạn muốn làm trong nhật thực vì không có gì thay đổi vì nó chỉ là mã của bạn. Nếu bạn muốn xóa dữ liệu ứng dụng hiện tại khỏi thiết bị, hãy vào 'Cài đặt Android> Ứng dụng> Quản lý ứng dụng> Ứng dụng của bạn> Xóa dữ liệu' (xin lỗi nếu tên không khớp, menu của tôi là tiếng Đức) – Knickedi

+0

Trong trường hợp bạn không muốn xóa tất cả dữ liệu ứng dụng (nếu có các cơ sở dữ liệu khác hoạt động tốt mà bạn không muốn xóa ví dụ), tôi khuyên bạn nên truy cập qua Trình gỡ lỗi Android và chỉ xóa tệp cơ sở dữ liệu SQLite vi phạm. Điều này làm việc như một sự quyến rũ đối với tôi khi tôi ở vị trí này. – Godsmith

0

SQLiteOpenHelper.onCreate() được gọi trở lại sau khi SQLiteOpenHelper.getWritableDatabase() (hoặc sau SQLiteOpenHelper.getReadableDatabase()) chỉ khi cơ sở dữ liệu không tồn tại trong ứng dụng của lưu trữ liên tục (ví dụ: thẻ SD). Nói cách khác, onCreate() chỉ được gọi một lần, nếu mã tạo thành công cơ sở dữ liệu - được lưu trữ trong lưu trữ liên tục. Nếu cơ sở dữ liệu tồn tại trong bộ nhớ liên tục, nhưng bạn đang thay đổi lược đồ của nó, nhưng bạn đang thay đổi lược đồ,

bạn sử dụng SQLiteOpenHelper.onUpgrade(), được gọi lại khi bạn mở cơ sở dữ liệu theo tên nhưng với số phiên bản chưa được sử dụng trước đó. Trong đó bạn thả các đối tượng lược đồ cũ, và sau đó bạn có thể gọi SQLiteOpenHelper.onCreate() để tạo lược đồ mới của mình. Và nếu bạn muốn chạy mã bất cứ khi nào cơ sở dữ liệu được mở (mã được gọi là SQLiteOpenHelper.get[Writable,Readable]Database()), hãy thực hiện onOpen(). Sau đó, gọi một phương thức khởi tạo cơ sở dữ liệu của bạn (hoặc mã được khởi tạo dựa vào cơ sở dữ liệu của bạn) được gọi từ mỗi số SQLiteOpenHelper.onCreate()SQLiteOpenHelper.onOpen(). Ví dụ:

Ví dụ: bạn có thể muốn sử dụng tham chiếu đến SQLiteDatabase, để gọi phương thức quản lý dữ liệu như SQLiteDatabase.execSQL().

Trong mỗi

SQLiteOpenHelper.onCreate(SQLiteDatabase db) 

SQLiteOpenHelper.onOpen(SQLiteDatabase db) 

gọi cái gì đó như

void initDB(SQLiteDatabase db) 
{ 
    this.db = db; 
} 

Có những sự kiện vòng đời đối tượng khác mà gọi lại xử lý trong mã của bạn rằng bạn nên xử lý, như Android đa nhiệm quá trình của bạn. Nhưng ở mức tối thiểu, mã xử lý cơ sở dữ liệu của bạn phải xử lý SQLiteOpenHelper.onCreate()SQLiteOpenHelper.onOpen().

0

Tôi gặp vấn đề tương tự. Tôi tài trợ cho 2 giải pháp

  1. Khởi động lại giả lập và kiểm tra 'Wipe sử dụng dữ liệu' giả lập của tôi là chậm khởi động lại như vậy ...
  2. Thay đổi Số Phiên bản cơ sở dữ liệu của bạn và nó được gọi là 'OnCreate' một lần nữa và đã cho tôi một phiên bản của cơ sở dữ liệu của tôi.Tôi bị mất các thông tin lưu trữ (không Deal lớn)

Good Luck

10

Đó là một hạn chế thực hiện chứ không phải ngu ngốc. :-) Hãy chắc chắn rằng tên cơ sở dữ liệu có một phần mở rộng .db. onCreate() sẽ không được gọi nếu nó không có phần mở rộng.

+1

wow ... cảm ơn bạn rất nhiều! Điều này khiến tôi phát điên! ... Thật là ngu ngốc! – Mahm00d

+1

Ngay cả bên trong Tài liệu Android. Ví dụ họ có không có nó. http://developer.android.com/training/search/search.html – Neta

+0

WOOOOOOOOOOW THX SO MUCH! điều này khiến tôi phát điên! 1 dude bạn rulz –

0

Tôi gặp sự cố tương tự. Tôi đã quên một khoảng trống giữa hai lệnh sql trong chuỗi SQL_Create của tôi và vì vậy cột tôi cần không được triển khai chính xác, nhưng khi tôi tìm thấy và sửa lỗi trong Chuỗi, nó không khắc phục được sự cố, vì Ứng dụng đã đã đăng ký cơ sở dữ liệu đó khi có bảng đó. Vì vậy, onCreate không bao giờ được gọi. Đối với tôi, giải pháp đơn giản nhất là cập nhật số phiên bản. Điều này tạo ra một db mới và bảng (chính xác), và cố định các ứng dụng.

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