usar una studio propia nuestra importar fichero descargar datos crear como acceder java android libgdx sqliteopenhelper

java - una - usar base de datos en android studio



Usando una base de datos SQLite en Libgdx (2)

Hay una extensión (llamada gdx-sqlite) que escribí que hará la mayor parte del trabajo que requiera. La última versión de esta extensión se puede descargar desde here . El código fuente y léeme están ubicados en: https://github.com/mrafayaleem/gdx-sqlite

Esta extensión actualmente soporta plataformas Android y de escritorio. Además, no hay soporte para abrir bases de datos ubicadas en la carpeta de activos de la aplicación de Android. Sin embargo, esta es una característica pendiente y se agregará pronto.

Siga las instrucciones en Léame para configurar sus proyectos para el manejo de bases de datos. A continuación se muestra un código de ejemplo:

package com.mrafayaleem.gdxsqlitetest; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.sql.Database; import com.badlogic.gdx.sql.DatabaseCursor; import com.badlogic.gdx.sql.DatabaseFactory; import com.badlogic.gdx.sql.SQLiteGdxException; public class DatabaseTest { Database dbHandler; public static final String TABLE_COMMENTS = "comments"; public static final String COLUMN_ID = "_id"; public static final String COLUMN_COMMENT = "comment"; private static final String DATABASE_NAME = "comments.db"; private static final int DATABASE_VERSION = 1; // Database creation sql statement private static final String DATABASE_CREATE = "create table if not exists " + TABLE_COMMENTS + "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_COMMENT + " text not null);"; public DatabaseTest() { Gdx.app.log("DatabaseTest", "creation started"); dbHandler = DatabaseFactory.getNewDatabase(DATABASE_NAME, DATABASE_VERSION, DATABASE_CREATE, null); dbHandler.setupDatabase(); try { dbHandler.openOrCreateDatabase(); dbHandler.execSQL(DATABASE_CREATE); } catch (SQLiteGdxException e) { e.printStackTrace(); } Gdx.app.log("DatabaseTest", "created successfully"); try { dbHandler .execSQL("INSERT INTO comments (''comment'') VALUES (''This is a test comment'')"); } catch (SQLiteGdxException e) { e.printStackTrace(); } DatabaseCursor cursor = null; try { cursor = dbHandler.rawQuery("SELECT * FROM comments"); } catch (SQLiteGdxException e) { e.printStackTrace(); } while (cursor.next()) { Gdx.app.log("FromDb", String.valueOf(cursor.getString(1))); } try { dbHandler.closeDatabase(); } catch (SQLiteGdxException e) { e.printStackTrace(); } dbHandler = null; Gdx.app.log("DatabaseTest", "dispose"); } }

Soy nuevo en Libgdx y tengo problemas para usar una base de datos en mi juego.

Busqué un tutorial sobre cómo hacer que SQLite funcione en aplicaciones tanto de Android como de escritorio usando Libgdx, pero no encontré una fácil.

La última vez que usé una base de datos en Android, creé una clase que se extiende desde SQLiteOpenHelper .

¿Hay una manera simple de hacer lo mismo usando Libgdx? O al menos, ¿puede alguien indicarme un tutorial paso a paso o algo similar?

EDITAR

Olvidé decir que estoy buscando algo que me permita administrar versiones como SQLiteOpenHelper . En otras palabras, quiero recrear mi base de datos en Android en la instalación de apk, cuando cambio la versión de mi base de datos en el código.

SOLUCIÓN

Siguiendo la respuesta de @42n4 , logré conectarme a la base de datos SQLite utilizando SQLiteOpenHelper en la aplicación de Android y JDBC en la aplicación de escritorio.

Primero, creé una "clase común" para aplicaciones de escritorio y Android:

//General class that needs to be implemented on Android and Desktop Applications public abstract class DataBase { protected static String database_name="recycling_separation"; protected static DataBase instance = null; protected static int version=1; //Runs a sql query like "create". public abstract void execute(String sql); //Identical to execute but returns the number of rows affected (useful for updates) public abstract int executeUpdate(String sql); //Runs a query and returns an Object with all the results of the query. [Result Interface is defined below] public abstract Result query(String sql); public void onCreate(){ //Example of Highscore table code (You should change this for your own DB code creation) execute("CREATE TABLE ''highscores'' (''_id'' INTEGER PRIMARY KEY NOT NULL , ''name'' VARCHAR NOT NULL , ''score'' INTEGER NOT NULL );"); execute("INSERT INTO ''highscores''(name,score) values (''Cris'',1234)"); //Example of query to get DB data of Highscore table Result q=query("SELECT * FROM ''highscores''"); if (!q.isEmpty()){ q.moveToNext(); System.out.println("Highscore of "+q.getString(q.getColumnIndex("name"))+": "+q.getString(q.getColumnIndex("score"))); } } public void onUpgrade(){ //Example code (You should change this for your own DB code) execute("DROP TABLE IF EXISTS ''highscores'';"); onCreate(); System.out.println("DB Upgrade maded because I changed DataBase.version on code"); } //Interface to be implemented on both Android and Desktop Applications public interface Result{ public boolean isEmpty(); public boolean moveToNext(); public int getColumnIndex(String name); public float getFloat(int columnIndex); [...] } }

Luego, creé una clase DatabaseDesktop para aplicaciones de escritorio:

public class DatabaseDesktop extends DataBase{ protected Connection db_connection; protected Statement stmt; protected boolean nodatabase=false; public DatabaseDesktop() { loadDatabase(); if (isNewDatabase()){ onCreate(); upgradeVersion(); } else if (isVersionDifferent()){ onUpgrade(); upgradeVersion(); } } public void execute(String sql){ try { stmt.execute(sql); } catch (SQLException e) { e.printStackTrace(); } } public int executeUpdate(String sql){ try { return stmt.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); } return 0; } public Result query(String sql) { try { return new ResultDesktop(stmt.executeQuery(sql)); } catch (SQLException e) { e.printStackTrace(); } return null; } private void loadDatabase(){ File file = new File (database_name+".db"); if(!file.exists()) nodatabase=true; try { Class.forName("org.sqlite.JDBC"); db_connection = DriverManager.getConnection("jdbc:sqlite:"+database_name+".db"); stmt = db_connection.createStatement(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } private void upgradeVersion() { execute("PRAGMA user_version="+version); } private boolean isNewDatabase() { return nodatabase; } private boolean isVersionDifferent(){ Result q=query("PRAGMA user_version"); if (!q.isEmpty()) return (q.getInt(1)!=version); else return true; } public class ResultDesktop implements Result{ ResultSet res; boolean called_is_empty=false; public ResultDesktop(ResultSet res) { this.res = res; } public boolean isEmpty() { try { if (res.getRow()==0){ called_is_empty=true; return !res.next(); } return res.getRow()==0; } catch (SQLException e) { e.printStackTrace(); } return false; } public boolean moveToNext() { try { if (called_is_empty){ called_is_empty=false; return true; } else return res.next(); } catch (SQLException e) { e.printStackTrace(); } return false; } public int getColumnIndex(String name) { try { return res.findColumn(name); } catch (SQLException e) { e.printStackTrace(); } return 0; } public float getFloat(int columnIndex) { try { return res.getFloat(columnIndex); } catch (SQLException e) { e.printStackTrace(); } return 0; } [...] } }

Y una aplicación DatabaseAndroid para Android.

public class DatabaseAndroid extends DataBase{ protected SQLiteOpenHelper db_connection; protected SQLiteDatabase stmt; public DatabaseAndroid(Context context) { db_connection = new AndroidDB(context, database_name, null, version); stmt=db_connection.getWritableDatabase(); } public void execute(String sql){ stmt.execSQL(sql); } public int executeUpdate(String sql){ stmt.execSQL(sql); SQLiteStatement tmp = stmt.compileStatement("SELECT CHANGES()"); return (int) tmp.simpleQueryForLong(); } public Result query(String sql) { ResultAndroid result=new ResultAndroid(stmt.rawQuery(sql,null)); return result; } class AndroidDB extends SQLiteOpenHelper { public AndroidDB(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } public void onCreate(SQLiteDatabase db) { stmt=db; DatabaseAndroid.this.onCreate(); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { stmt=db; DatabaseAndroid.this.onUpgrade(); } } public class ResultAndroid implements Result{ Cursor cursor; public ResultAndroid(Cursor cursor) { this.cursor=cursor; } public boolean isEmpty() { return cursor.getCount()==0; } public int getColumnIndex(String name) { return cursor.getColumnIndex(name); } public String[] getColumnNames() { return cursor.getColumnNames(); } public float getFloat(int columnIndex) { return cursor.getFloat(columnIndex); } [...] } }

Finalmente, cambié las clases principales de aplicaciones de Android y de escritorio:

public class Main extends AndroidApplication { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initialize(new MyGame(new DatabaseAndroid(this.getBaseContext())), false); } } public class Main { public static void main(String[] args) { new LwjglApplication(new MyGame(new DatabaseDesktop()), "Example", MyGame.SCREEN_WIDTH, MyGame.SCREEN_HEIGHT,false); } }

Tenga en cuenta que:

Hice una gestión de versiones como la que ocurre en SQLiteOpenHelper utilizando la PRAGMA user_version . De esta manera, solo cambio la versión de la clase DataBase cuando necesito actualizarla.

No puse todos los métodos que hice en Result , pero puse los que creo que son más importantes. Eso es más importante.