2016-05-03 10 views
0

私はこのようなアプリのデータベースにアクセスするためにADBを使用しています:接続を閉じずにADB経由でアプリケーションデータベースに何度もアクセスしていますか?

public static int runCommandInt(String arg1) { 
    try { 
      ProcessBuilder proc = new ProcessBuilder(adbLocation, "shell", "sqlite3", 
       "/data/data/com.package/databases/Database.db", arg1); 
      Process p = proc.start(); 
      BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
      String s = null; 
      int i = 0; 
      while ((s = stdInput.readLine()) != null) { 
       i = Integer.parseInt(s); 
       p.destroyForcibly(); 
       return i; 
      } 
      while ((s = stdError.readLine()) != null) { 
       System.out.println(s); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return 0; 
} 

これに伴う問題は、しかし、私は、コマンドを実行しようとするたびに、それはADB(したがって、データベース接続を開閉することです同様に非常に非効率的です)、同じadbウィンドウを取得してそこにもっと多くのコマンドを実行する方法はありますか?

は、残念ながらadbを通過するです。毎秒データベースをプルしてローカルにチェックすると、エラーの余地があまりにも大きくなります。

+0

非効率だと思う以外の目的を達成するこの方法について他に苦情がありますか?あなたが必要とするのは、毎秒いくつかの値を照会することです - 私は事を変更しません。他の問題がある場合は、それらについて聞かせてください。 –

答えて

-1

はい、良い質問です!このコードでConnectionManagerをチェックしてください!これは、シングルトンパターンと呼ばれるものを使用します。ConstructionManagerオブジェクトの唯一のコンストラクタはprivateです。 getInstanceメソッドを使用して、データベース接続のインスタンスを取得します。すでに接続のインスタンスが存在する場合は、すでに存在するConnectionを返します。さもなければ、それは先に進んで新しいものを構築する。そうすれば、初めて接続するだけです。

public class ConnectionManager { 
    private static ConnectionManager instance = null; 

    private final String USERNAME = "corbin"; 
    private final String PASSWORD = "letmein"; 
    private final String CONNECTION = "jdbc:hsqldb:file:C:\\Users\\Corbin\\Java Proj\\TaskTracker\\Kurafuto\\db"; 

    private Connection conn = null; 

    private ConnectionManager() { 
    } 

    public static ConnectionManager getInstance() { 
     if (instance == null) { 
     instance = new ConnectionManager(); 
     } 
     return instance; 
    } 

    private boolean openConnection() { 
     try { 
     conn = DriverManager.getConnection(CONNECTION, USERNAME, PASSWORD); 
     System.out.println("Connection Opened!"); 
     return true; 
     } catch (SQLException e) { 
     System.err.println(e); 
     return false; 
     } 
    } 

    public Connection getConnection() { 
     if (conn == null) { 
     if (openConnection()) { 
      return conn; 
     } else { 
      return null; 
     } 
     } 
     return conn; 
    } 

    public void close() { 
     System.out.println("Closing connection..."); 
     try { 
     conn.close(); 
     conn = null; 
     } catch (Exception e) { 
     } 
    } 
} 

ConnectionManager.getInstance().getConnection();

+0

これはADBを通過しないので、私の質問には答えません。 –

0

Connectionは、次

p.standardinputなどの標準入力にコマンドを書き込み、標準入力と標準エラー

をリダイレクトし、コマンドプロンプトを起動するプロセスを作成しなさい。 writeline( "adbコマンドはここに"); コマンドが完了したとき、または標準エラーまたは出力の非同期的な読み取りを使用して返された情報を取得するとき

関連する問題