2012-09-03 29 views
10

Tôi đang tạo một ứng dụng cơ sở dữ liệu và chương trình của tôi hoạt động và tôi đã hiểu hầu hết các hướng dẫn mà tôi đã theo dõi. Tuy nhiên, một khía cạnh vẫn chưa rõ ràng với tôi.SQLiteOpenHelper - cơ sở dữ liệu được tạo ra như thế nào?

Có một lớp bên trong của MyDBHelper mở rộng SQLiteOpenHelper. Bên ngoài biến bao gồm SQLiteDatabase được gọi là d. Mã cho MyDBHelper là:

private static class MyDBHelper extends SQLiteOpenHelper { 
     MyDBHelper(Context c) { 
      super(c, DB_NAME, null, DB_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      try { 
       db.execSQL(DATABASE_CREATE); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVers, int newVers) { 
      Log.w(TAG, "Upgrading database from version " + oldVers + " to " + newVers + ", which will destroy all old data."); 
      db.execSQL("DROP TABLE IF EXISTS GM"); 
      onCreate(db); 
     } 
    } 

Câu hỏi của tôi là cách thực sự tạo cơ sở dữ liệu ban đầu. Nó xảy ra trong phương thức onCreate(), nhưng theo như tôi thấy, đây là không bao giờ được gọi là. Tôi hiểu rằng nó được gọi khi cơ sở dữ liệu được tạo ra lần đầu tiên, nhưng ở đâu? Và hơn nữa, làm thế nào nó được thông qua một db SQLiteDatabase? Tôi đã không thông qua bất kỳ cơ sở dữ liệu cho phương pháp. Và biến db SQLiteDatabase của tôi từ lớp bên ngoài được đặt thành cơ sở dữ liệu đã tạo như thế nào? Ai đó có thể nói chuyện với tôi như một thằng ngốc? Các phương thức

Trả lời

7

onCreate()onUpgrade() thực sự được gọi là lần đầu tiên khi Db được tạo. Trong thực tế, nó đã được kiểm tra theo phương thức getReadableDatabase() or getWritebleDatabase() của SQLiteOpenHelper. Nó sẽ kiểm tra xem DB đã tồn tại trên thư mục dữ liệu chưa và phiên bản của nó là gì. Theo đó, nó sẽ gọi onCreate(), or onUpgrade(). Hoặc không có gì, nếu tệp db tồn tại và có phiên bản chính xác.

Bạn có thể tìm kiếm mã của mình để thực hiện myDBHelper.getReadable(Writable)Database(). Đó là thời điểm kiểm tra này sẽ được thực hiện.

Vui lòng cho tôi biết nếu cần thêm chi tiết. Chúc may mắn

0

Có lẽ, trong getReadableDatabase() hoặc getWriteableDatabase() khi chúng được gọi là lần đầu tiên


3

Hãy nhớ rằng bạn đang mở rộng SQLiteOpenHelper, tất cả sự kỳ diệu sẽ xảy ra trong lớp học siêu này, đặc biệt là cơ sở dữ liệu là ban đầu được tạo (hoặc chỉ mở lại) khi bạn gọi getReadableDatabase() hoặc getWritableDatabase(). Hai phương pháp:

  • Xác định SQLiteDatabase db biến (và kiểm soát thông qua db với các phương pháp gọi lại của bạn)
  • Initialize db bằng cách gọi phương pháp onCreate(db) của bạn hoặc mở cơ sở dữ liệu hiện có
  • Kiểm tra số phiên bản và gọi onUpgrade(db) của bạn hoặc onDowngrade(db) nếu cần thiết

Họ cũng gọi thêm một vài phương thức gọi lại như onConfigure(db), onOpen(db), v.v. (Read more về các phương pháp này.) Nếu nó giúp, bạn có thể tự mình đọc qua số the source code để hiểu cấu trúc của cách thức và thời điểm tất cả điều này xảy ra.

1

Phương thức onCreate() không phải là hàm tạo cho lớp này. onCreate được gọi khi bạn tạo DB.

Ở đây PeopleDB mở rộng SQLiteOpenHelper.Mã này là từ một lớp khác nhau và onCreate được gọi khi getWritableDatabase() hoặc getReadableDatabase(), hoặc bất cứ điều gì trong những loại được gọi là

PeopleDB db = null; //onCreate NOT called here 
    db=new PeopleDB(getContext()); 
    db.getWritableDatabase(); //onCreate is called here! 

Hy vọng rằng sẽ giúp.

1

Xem cơ sở dữ liệu của chúng tôi được tạo trong chính hàm tạo của openhelper không nằm trong phương thức onCreate được ghi đè. Bên trong phương thức onCreate, chúng tôi đang kích hoạt một truy vấn để tạo một bảng trong cơ sở dữ liệu được tạo trong hàm tạo của trình trợ giúp mở để chèn dữ liệu không tạo cơ sở dữ liệu.

Một điều nữa là đối tượng SQLiteDatabase không được khởi tạo trong lớp SQLiteOpenHelper. Nó được khởi tạo trong lớp mà bạn muốn sử dụng cơ sở dữ liệu để thực hiện các hoạt động db và ở đó bạn cần viết một hàm như thế này để intialise hoặc mở cơ sở dữ liệu của bạn để sẵn sàng cho việc chèn.

SQLiteDatabase database; 

YourOpenHelper yourOpenHelper=new YourOpenHelper(); //to creating database using openhelper and automatically call onCreate to make a table in that 

    public void open() throws SQLException { 
      database = profiloHelper.getWritableDatabase(); 
     } 

Đây là mã bạn phải viết cho bất kỳ hoạt động trong cơ sở dữ liệu như xóa chèn bất cứ điều gì, bạn chỉ cần phải thay đổi QUERY

SQLiteStatement insert_stmt = null; 

     try { 
      insert_stmt = database.compileStatement(YOUR_QUERY); 

      insert_stmt.bindString(1, field1); 
      insert_stmt.bindString(2, field2); 
      insert_stmt.executeInsert(); 
     } 
     finally { 
      if (insert_stmt != null) insert_stmt.close(); 
     } 
0

Bạn tạo một lớp con thực hiện onCreate (SQLiteDatabase), onUpgrade (SQLiteDatabase, int, int) và tùy chọn onOpen (SQLiteDatabase), và lớp này sẽ quan tâm đến việc mở cơ sở dữ liệu nếu nó tồn tại, tạo nó nếu nó không, và nâng cấp nó khi cần thiết. (Trang web dành cho nhà phát triển Android)

0

Lớp học SQLiteOpenHelper được gọi là "Người trợ giúp" vì lý do chính đáng. Nó giúp chúng tôi tiết kiệm đáng kể nỗ lực của các nhà văn ứng dụng.

Các lần đầu tiên mà bạn gọi getWritableDatabase (hoặc getReadableDatabase) để thực hiện lại SQLiteOpenHelper, tuyên bố super của bạn trong constructor của bạn vượt qua hiện tại Context và cơ sở dữ liệu NAME mà bạn thích để các nhà xây dựng lớp cha cho SQLiteOpenHelper.

Trình tạo lớp bậc trên sau đó thiết lập không gian ban đầu cho số SQLiteDatabase của bạn và gán cho nó tên bạn đã vượt qua super.

Khi hoàn tất, trình tạo lớp bậc trên gọi onCreate và chuyển tên là SQLiteDatabase mà nó tạo thông qua tham số duy nhất của onCreate. Kể từ khi onCreate chỉ được gọi là một lần này, đó là một nơi rất tốt để gọi execSQL để xác định cấu trúc cơ sở dữ liệu của bạn.

Thực hiện tiếp theo getReadableDatabase (hoặc getWritableDatabase) chỉ cần mở cơ sở dữ liệu cho bạn và không bao giờ gọi lại onCreate. (Khi các nhà xây dựng lớp cha nhấn mạnh rằng super đã gửi một số phiên bản khác nhau, onUpgrade là calle.)

Hiểu được cách SQLiteOpenHelper tạo ra một cơ sở dữ liệu mà không cần mã rõ ràng và làm thế nào heck onCreate được thông qua một cuộc tranh cãi "ra khỏi màu xanh" là một công việc thực sự cho tôi. Bây giờ tôi không thể tin rằng nó có thể đã từng khó khăn.

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