2010-09-18 39 views
6

Tôi muốn ép buộc một ràng buộc khóa ngoài trên một bảng trong một ứng dụng Android.Trình kích hoạt SQLite trong Android?

Tôi đã tìm kiếm rằng điều này có thể được thực hiện bằng cách sử dụng trigger:

tôi đã làm nó như thế này:

db.execSQL("CREATE TRIGGER dept_id_trigger22+" + 
       " AFTER INSERT "+ 
       " OF EmployeeName ON Employees"+ 
       " BEGIN"+ 
            //Condition 
       " RAISE(ABORT,'error') END;"); 

nhưng không có lỗi được nuôi nấng và các giá trị bất hợp pháp được chèn vào.

có vấn đề gì với điều này?

+0

Tôi không có mã ở đây, nhưng một kích hoạt cơ bản làm việc cho tôi trên SQLite và (theo đơn vị xét nghiệm của tôi) nó đã làm việc trên tất cả các phiên bản Android. –

+0

bạn có nghĩ mã của tôi là chính xác hoặc thiếu cái gì đó không? –

+0

Bất kỳ ai tìm cú pháp trình kích hoạt với ví dụ triển khai trong android. http://www.coderconsole.com/2015/02/android-sqlite-trigger-demo.html – nitesh

Trả lời

6

Ok Tôi đã nhận nó

Android hỗ trợ trình kích hoạt SQLite.

Cú pháp đúng là

db.execSQL("CREATE TRIGGER dept_id_trigger22" + 
       " AFTER INSERT "+ 
       "ON Employees"+ 
       " BEGIN"+ 
            //Condition 
       " SELECT RAISE(ABORT,'error'); END;"); 

Tôi quên để thêm dấu chấm phẩy sau khi tuyên bố tăng lương.

Điều này không thực hiện tuyên bố nhưng nó không ném ngoại lệ. vẫn sẽ tìm kiếm cách để ném ngoại lệ

nhờ

0

Tôi phát hiện ra rằng phiên bản SQLite được sử dụng không hỗ trợ khóa ngoài - vì vậy tôi mong rằng trình kích hoạt cũng không được hỗ trợ.

+0

cảm ơn sự giúp đỡ của bạn, nhưng bạn có thể cung cấp cho tôi bất kỳ tham chiếu nào đến vấn đề này –

+0

Tôi tin rằng giả định của bạn là sai vì nó hỗ trợ kích hoạt –

+0

Có vẻ như vậy. Tôi tìm kiếm nó, và từ những gì tôi đọc tôi nghĩ rằng các tính năng này có sẵn, nhưng không được kích hoạt theo mặc định. Tôi không biết làm thế nào để sử dụng gây nên được nêu ra, nhưng có một phương pháp thú vị trong lớp SQLiteDatabase gọi là markTableSyncable (String bảng, String ForeignKey, String updateTable) mà có thể là những gì bạn muốn: http://developer.android.com/ tham khảo/android/database/sqlite/SQLiteDatabase.html # markTableSyncable% 28java.lang.String,% 20java.lang.String,% 20java.lang.String% 29 – mreichelt

1

Tôi không mong đợi bất kỳ phiếu cho câu trả lời này, chỉ cần để cho bạn biết:

Bạn có thể sử dụng cơ sở dữ liệu khác, ví dụ như H2 database. Disclaimer: Tôi là tác giả chính của H2.

Có một số nhược điểm: một số (không phải tất cả) hoạt động chậm hơn, ví dụ như mở và đóng cơ sở dữ liệu. Tệp jar tương đối lớn (khoảng 1 MB). Bạn sẽ phải sử dụng API JDBC.

Nhưng lợi thế là: H2 hỗ trợ sử dụng trình kích hoạt, ràng buộc, v.v.

+0

Cảm ơn Thomas Tôi sẽ xem xét sử dụng nó. –

+0

Tôi có lẽ nên thêm: Theo thử nghiệm (giới hạn) của tôi, một số thao tác nhanh hơn và một số hoạt động chậm hơn rất nhiều. Tôi đang làm việc trên đó, và bạn có thể mong đợi rằng hiệu suất của H2 trên Android sẽ cải thiện trong những tháng tới. Tôi cũng muốn triển khai API Android để chuyển từ SQLite sang H2 dễ dàng hơn. –

3

phím nước ngoài chỉ được hỗ trợ trên Android trên Froyo (2.2) hoặc mới hơn, cho các phiên bản trước, bạn có thể bao gồm họ nhưng SQLite bỏ qua chúng. Tất cả các phiên bản hỗ trợ SQLite của Android đều kích hoạt để tạo ra hiệu ứng tương tự.

Phiên bản mới hơn của SQLite (cho PC của bạn) có lệnh gọi là "genfkey" sẽ phân tích cơ sở dữ liệu SQLite của bạn (có khóa ngoài) và tạo ra các trình kích hoạt tương đương. Bằng cách này bạn có thể thiết kế các bảng của bạn với các ràng buộc khóa ngoài trong khi cũng hỗ trợ tất cả các phiên bản của hệ điều hành.

Trên Windows, mở công cụ dòng lệnh SQLite với tập tin cơ sở dữ liệu của bạn như một tham số:

sqlite3 mydatabase.db 
.genfkey --exec 

này sẽ tạo ra trigger cho tất cả các khó khăn chính của bạn.

1

Để xóa cuối 50 hàng khi đếm lớn hơn 100

sqliteDB.execSQL("CREATE TRIGGER IF NOT EXISTS delete_trigger 
    AFTER INSERT ON table1 
    WHEN (SELECT COUNT(*) FROM table1) > 50 " + 
    BEGIN 
     delete From table1 where id not in(select id from table1 order by id desc limit 100; 
    END;" 
); 
Các vấn đề liên quan