2012-01-26 33 views
5

Tôi đang chuyển mã iOS hoạt động hoàn hảo cho hệ điều hành Android. Tôi thực hiện một loạt các truy vấn, chèn các kết quả của các truy vấn vào một bảng tạm thời. Khi tất cả các truy vấn được hoàn thành, tôi lấy tất cả các kết quả từ bảng tạm thời vào một tập hợp các đối tượng tạo của riêng tôi. Tôi đang sử dụng một bảng tạm thời thay vì chọn thẳng vào bộ sưu tập bởi vì tôi tin rằng nó thực hiện nhanh hơn, hoặc ít nhất là nó trên anyways iOS. Vấn đề của tôi là execSQL() không hoạt động như tôi mong đợi, đây là mã:SQLiteDatabase.execSQL không hoạt động như mong đợi cho truy vấn INSERT INTO

db.execSQL("CREATE TEMPORARY TABLE SearchResults(Name text);"); 
db.execSQL("INSERT INTO SearchResults (Name) SELECT Name FROM ProductNames WHERE NameLower MATCH '" + termLowerCase + "*';"); 
db.execSQL("INSERT INTO SearchResults (Name) SELECT Name FROM BrandNames WHERE NameLower MATCH '" + termLowerCase + "*';"); 

Khi tôi thực thi mã này tôi chỉ bao giờ có được một hàng từ execSQL đầu tiên() gọi với INSERT. Tôi biết có nhiều kết quả trong bảng ProductNames phù hợp với thuật ngữ của tôi và tôi biết có hàng trăm hàng trong bảng BrandNames khớp với thuật ngữ của tôi. Nếu tôi thay đổi mã này:

Cursor cursor = db.rawQuery("SELECT Name FROM ProductNames WHERE NameLower MATCH '" + termLowerCase + "*'", null); 
cursor.moveToFirst(); 
while (!cursor.isAfterLast()) 
{ 
    resultSet.add(cursor.getString(0)); 
    cursor.moveToNext(); 
} 
cursor.close(); 
cursor = db.rawQuery("SELECT Name FROM BrandNames WHERE NameLower MATCH '" + termLowerCase + "*'", null); 
cursor.moveToFirst(); 
while (!cursor.isAfterLast()) 
{ 
    resultSet.add(cursor.getString(0)); 
    cursor.moveToNext(); 
} 

Tôi nhận được tất cả kết quả mong đợi.

Có ai cho tôi biết tôi đang làm gì sai không? Tôi có sử dụng execSQL() theo cách không thích hợp không? Tôi cho rằng nó chỉ đơn giản là chuyển truy vấn vào sqlite3_exec() mà là những gì tôi sử dụng trên iOS. Nếu tôi đang sử dụng execSQL() không thích hợp những hạn chế của nó là gì và thay thế nhanh nhất cho những gì tôi muốn làm là gì? Cảm ơn rất nhiều sự giúp đỡ nào!

Trả lời

0

Theo tài liệu SQLiteDatabase bạn không thể sử dụng execSQL trong trường hợp này. Hãy thử thực hiện câu lệnh đó bằng rawQuery.

+0

Tôi tin rằng tài liệu cho biết không sử dụng tài liệu nếu bạn cần dữ liệu được trả về từ truy vấn. Sử dụng rawQuery dường như không khả thi trong kịch bản của tôi, mã truy vấn thô ở trên mất một khoảng thời gian rất dài để chạy trên ADP2 của tôi. Ngoài ra lưu ý, tôi đã thử nghiệm porting trên một số truy vấn khác của tôi từ phiên bản iOS trong một phương pháp riêng biệt mà cũng sử dụng INSERT INTO với một SELECT bằng cách sử dụng Fts3 MATCH và những điều này dường như làm việc tốt. Vấn đề này vẫn còn là một bí ẩn. –

+0

Cách tôi hiểu tài liệu nói rằng nó sẽ chạy MỘT câu lệnh KHÔNG PHẢI là CHỌN. Ý nghĩa, INSERT + SELECT vi phạm cả hai ràng buộc của tài liệu đó. Nó có hoạt động khi bạn sử dụng rawQuery không? Trong khi chậm, hãy xem xét hoạt động bạn đang thực hiện trên kích thước dữ liệu của mình. Nó không phải là một hoạt động tầm thường. – jlindenbaum

+0

Có, tôi nhận được những gì bạn đang nói ở đây, tuy nhiên tôi có các cuộc gọi execSQL() với lệnh INSERT INTO và SELECT trong truy vấn. Dưới đây là ví dụ về cách hoạt động: sql = "INSERT INTO SearchResults (SearchOrder, PID, ProductName, DBTable)" + "SELECT 3, P.ProductID, P.Name, 0" + "FROM Ingredients I" + "INNER JOIN ProductAltNames A ON (I.IngredientsID = A.IngredientID)" + "INNER JOIN ProductNames P ON (A.ProductID = P.ProductID)" + "WHERE I.DescriptionLower MATCH '" + termLowerCase + "*' "; db.execSQL (sql); –

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