AndroidでPythonを使用してSQLに接続する
-
25-09-2019 - |
質問
Android では Python やその他のスクリプト言語を使用できることは知っています。しかし、私は天気を見たことはありません、アンドロイドのsqliteへのインターフェイスとしてPythonを使用することが可能だったのかどうか。これは可能でしょうか?これは、SQLite が必要になった最初の Android アプリであり、Java API の使用は遅れています。
それが不可能な場合、誰かが Android の sqlite に関する優れたチュートリアルを教えてもらえますか?たくさん見つけましたが、どれもまったく異なっており、どれが最善の方法なのか完全に迷っています。
Google がユーザーに sqlite データベースをどのように使用することを期待しているのかを想像するのは困難です。データベースにクエリを実行するだけでも 10 個ほどの異なるクラスが必要なようです。
解決
実際に必要なのは 3 つのクラスだけです。
あ コンテンツプロバイダー, 、ここにあります: http://developer.android.com/guide/topics/providers/content-providers.html
次に必要なのは、 SQLiteOpenHelper そして最後になりましたが、 カーソル
編集:スニペットからは何があるか明らかではないことに今気づきました db
変数は。これは SQLiteOpenHelper か、それを拡張したものです (onCreate、onUpgrade、コンストラクターのみをオーバーライドしています)。以下を参照してください^^
ContentProvider はデータベースと通信し、挿入、更新、削除を実行します。コンテンツ プロバイダーは、コードの他の部分 (許可している場合は他のアプリも) が sqlite に保存されているデータにアクセスすることも許可します。
その後、挿入/削除/クエリ/更新関数をオーバーライドして、インテントの URI に応じて異なるアクションを実行するなど、機能を追加できます。
public int delete(Uri uri, String whereClause, String[] whereArgs) {
int count = 0;
switch(URI_MATCHER.match(uri)){
case ITEMS:
// uri = content://com.yourname.yourapp.Items/item
// delete all rows
count = db.delete(TABLE_ITEMS, whereClause, whereArgs);
break;
case ITEMS_ID:
// uri = content://com.yourname.yourapp.Items/item/2
// delete the row with the id 2
String segment = uri.getPathSegments().get(1);
count = db.delete(TABLE_ITEMS,
Item.KEY_ITEM_ID +"="+segment
+(!TextUtils.isEmpty(whereClause)?" AND ("+whereClause+")":""),
whereArgs);
break;
default:
throw new IllegalArgumentException("Unknown Uri: "+uri);
}
return count;
}
UriMatcher は次のように定義されます。
private static final int ITEMS = 1;
private static final int ITEMS_ID = 2;
private static final String AUTHORITY_ITEMS ="com.yourname.yourapp.Items";
private static final UriMatcher URI_MATCHER;
static {
URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
URI_MATCHER.addURI(AUTHORITY_ITEMS, "item", ITEMS);
URI_MATCHER.addURI(AUTHORITY_ITEMS, "item/#", ITEMS_ID);
}
このようにして、1 つの結果のみを返すか更新するか、またはすべてをクエリするかどうかを決定できます。
SQLiteOpenHelper は実際に挿入を実行し、SQLite データベースの構造が変更された場合はアップグレードも処理します。オーバーライドすることでそこで実行できます。
class ItemDatabaseHelper extends SQLiteOpenHelper {
public ItemDatabaseHelper(Context context){
super(context, "myDatabase.db", null, ITEMDATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String createItemsTable = "create table " + TABLE_ITEMS + " (" +
...
");";
// Begin Transaction
db.beginTransaction();
try{
// Create Items table
db.execSQL(createItemsTable);
// Transaction was successful
db.setTransactionSuccessful();
} catch(Exception ex) {
Log.e(this.getClass().getName(), ex.getMessage(), ex);
} finally {
// End transaction
db.endTransaction();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String dropItemsTable = "DROP TABLE IF EXISTS " + TABLE_ITEMS;
// Begin transaction
db.beginTransaction();
try {
if(oldVersion<2){
// Upgrade from version 1 to version 2: DROP the whole table
db.execSQL(dropItemsTable);
onCreate(db);
Log.i(this.getClass().toString(),"Successfully upgraded to Version 2");
}
if(oldVersion<3) {
// minor change, perform an ALTER query
db.execSQL("ALTER ...");
}
db.setTransactionSuccessful();
} catch(Exception ex){
Log.e(this.getClass().getName(), ex.getMessage(), ex);
} finally {
// Ends transaction
// If there was an error, the database won't be altered
db.endTransaction();
}
}
}
そして、最も簡単な部分は次のとおりです。クエリを実行します。
String[] rows = new String[] {"_ID", "_name", "_email" };
Uri uri = Uri.parse("content://com.yourname.yourapp.Items/item/2";
// Alternatively you can also use getContentResolver().insert/update/query/delete methods
Cursor c = managedQuery(uri, rows, "someRow=1", null, null);
基本的にはこれですべてであり、私の知る限り最もエレガントな方法です。