diff --git a/MonoStockPortfolio.Core/AndroidSqliteBase.cs b/MonoStockPortfolio.Core/AndroidSqliteBase.cs new file mode 100644 index 0000000..b75834e --- /dev/null +++ b/MonoStockPortfolio.Core/AndroidSqliteBase.cs @@ -0,0 +1,46 @@ +using Android.Content; +using Android.Database.Sqlite; +using Android.Util; + +namespace MonoStockPortfolio.Core +{ + public abstract class AndroidSqliteBase : SQLiteOpenHelper + { + public const string PORTFOLIO_TABLE_NAME = "Portfolios"; + public const string POSITION_TABLE_NAME = "Positions"; + public const string CONFIG_TABLE_NAME = "Config"; + + public const string DATABASE_NAME = "stockportfolio.db"; + public const int DATABASE_VERSION = 1; + + protected AndroidSqliteBase(Context context) + : base(context, DATABASE_NAME, null, DATABASE_VERSION) + { + } + + protected SQLiteDatabase Db { get { return WritableDatabase; } } + + public override void OnCreate(SQLiteDatabase db) + { + db.ExecSQL("CREATE TABLE " + PORTFOLIO_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT)"); + db.ExecSQL("CREATE TABLE " + POSITION_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, Ticker TEXT, Shares REAL, PricePerShare REAL, ContainingPortfolioID INT)"); + db.ExecSQL("CREATE TABLE " + CONFIG_TABLE_NAME + " (StockItems TEXT)"); + + db.ExecSQL("INSERT INTO " + CONFIG_TABLE_NAME + " (StockItems) VALUES ('2,0,1,3')"); + db.ExecSQL("INSERT INTO " + PORTFOLIO_TABLE_NAME + " (Name) VALUES ('Sample portfolio')"); + db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('GOOG', '500', '593.97', 1)"); + db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('AMZN', '500', '180.00', 1)"); + db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('AAPL', '500', '322.56', 1)"); + db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('MSFT', '500', '27.91', 1)"); + db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('NOVL', '500', '5.92', 1)"); + db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('S', '500', '4.23', 1)"); + db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('VZ', '500', '35.78', 1)"); + db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('T', '500', '29.38', 1)"); + } + + public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) + { + Log.W("Upgrade", "Nothing to upgrade"); + } + } +} \ No newline at end of file diff --git a/MonoStockPortfolio.Core/Config/AndroidSqliteConfigRepository.cs b/MonoStockPortfolio.Core/Config/AndroidSqliteConfigRepository.cs index aa80e5c..2f94799 100644 --- a/MonoStockPortfolio.Core/Config/AndroidSqliteConfigRepository.cs +++ b/MonoStockPortfolio.Core/Config/AndroidSqliteConfigRepository.cs @@ -1,11 +1,36 @@ using System.Collections.Generic; +using System.Linq; +using Android.Content; using MonoStockPortfolio.Entities; namespace MonoStockPortfolio.Core.Config { - public class AndroidSqliteConfigRepository : IConfigRepository + public class AndroidSqliteConfigRepository : AndroidSqliteBase, IConfigRepository { + public AndroidSqliteConfigRepository(Context context) : base(context) + { } + public IEnumerable<StockDataItem> GetStockItems() + { + var cursor = Db.Query(CONFIG_TABLE_NAME, new[] { "StockItems" }, null, null, null, null, null); + string stockItemsCsv = null; + if (cursor.Count > 0) + { + cursor.MoveToNext(); + stockItemsCsv = cursor.GetString(0); + if (!cursor.IsClosed) cursor.Close(); + } + + if (string.IsNullOrEmpty(stockItemsCsv)) + { + return DefaultItems(); + } + + return stockItemsCsv.Split(',').Select(i => (StockDataItem)int.Parse(i)); + } + + // this should never be called, but it's here anyway in case of some catastrophe + private static IEnumerable<StockDataItem> DefaultItems() { var items = new List<StockDataItem>(); items.Add(StockDataItem.Ticker); diff --git a/MonoStockPortfolio.Core/MonoStockPortfolio.Core.csproj b/MonoStockPortfolio.Core/MonoStockPortfolio.Core.csproj index eaad376..fcad5df 100644 --- a/MonoStockPortfolio.Core/MonoStockPortfolio.Core.csproj +++ b/MonoStockPortfolio.Core/MonoStockPortfolio.Core.csproj @@ -46,6 +46,7 @@ <Compile Include="Config\IConfigRepository.cs" /> <Compile Include="DictionaryExtensions.cs" /> <Compile Include="EnumExtensions.cs" /> + <Compile Include="AndroidSqliteBase.cs" /> <Compile Include="PortfolioRepositories\AndroidSqlitePortfolioRepository.cs" /> <Compile Include="PortfolioRepositories\IPortfolioRepository.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> diff --git a/MonoStockPortfolio.Core/PortfolioRepositories/AndroidSqlitePortfolioRepository.cs b/MonoStockPortfolio.Core/PortfolioRepositories/AndroidSqlitePortfolioRepository.cs index 8881496..efeb042 100644 --- a/MonoStockPortfolio.Core/PortfolioRepositories/AndroidSqlitePortfolioRepository.cs +++ b/MonoStockPortfolio.Core/PortfolioRepositories/AndroidSqlitePortfolioRepository.cs @@ -7,25 +7,15 @@ using MonoStockPortfolio.Entities; namespace MonoStockPortfolio.Core.PortfolioRepositories { - public class AndroidSqlitePortfolioRepository : IPortfolioRepository + public class AndroidSqlitePortfolioRepository : AndroidSqliteBase, IPortfolioRepository { - private OpenHelper _dbHelper; - private SQLiteDatabase _db; - private const string PORTFOLIO_TABLE_NAME = "Portfolios"; - private const string DATABASE_NAME = "stockportfolio.db"; - private const int DATABASE_VERSION = 1; - private const string POSITION_TABLE_NAME = "Positions"; - - public AndroidSqlitePortfolioRepository(Context context) - { - _dbHelper = new OpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION); - _db = _dbHelper.WritableDatabase; - } + public AndroidSqlitePortfolioRepository(Context context) : base(context) + { } public IList<Portfolio> GetAllPortfolios() { var list = new List<Portfolio>(); - var cursor = _db.Query(PORTFOLIO_TABLE_NAME, new[] {"id", "Name"}, null, null, null, null, null); + var cursor = Db.Query(PORTFOLIO_TABLE_NAME, new[] { "id", "Name" }, null, null, null, null, null); if(cursor.Count > 0) { while(cursor.MoveToNext()) @@ -41,7 +31,7 @@ namespace MonoStockPortfolio.Core.PortfolioRepositories public Portfolio GetPortfolioById(long portfolioId) { - var cursor = _db.Query(PORTFOLIO_TABLE_NAME, new[] { "id", "Name" }, " ID = " + portfolioId, null, null, null, null); + var cursor = Db.Query(PORTFOLIO_TABLE_NAME, new[] { "id", "Name" }, " ID = " + portfolioId, null, null, null, null); if (cursor.Count > 0) { cursor.MoveToNext(); @@ -67,12 +57,12 @@ namespace MonoStockPortfolio.Core.PortfolioRepositories public void DeletePortfolioById(int portfolioId) { - _db.BeginTransaction(); + Db.BeginTransaction(); try { - _db.Delete(PORTFOLIO_TABLE_NAME, "id = " + portfolioId, null); - _db.Delete(POSITION_TABLE_NAME, "ContainingPortfolioID = " + portfolioId, null); - _db.SetTransactionSuccessful(); + Db.Delete(PORTFOLIO_TABLE_NAME, "id = " + portfolioId, null); + Db.Delete(POSITION_TABLE_NAME, "ContainingPortfolioID = " + portfolioId, null); + Db.SetTransactionSuccessful(); } catch (SQLiteException) { @@ -80,13 +70,13 @@ namespace MonoStockPortfolio.Core.PortfolioRepositories } finally { - _db.EndTransaction(); + Db.EndTransaction(); } } public Portfolio GetPortfolioByName(string portfolioName) { - var cursor = _db.Query(PORTFOLIO_TABLE_NAME, new[] { "id", "Name" }, " Name = '" + portfolioName + "'", null, null, null, null); + var cursor = Db.Query(PORTFOLIO_TABLE_NAME, new[] { "id", "Name" }, " Name = '" + portfolioName + "'", null, null, null, null); if (cursor.Count > 0) { cursor.MoveToNext(); @@ -100,14 +90,14 @@ namespace MonoStockPortfolio.Core.PortfolioRepositories public void DeletePositionById(long positionId) { - _db.Delete(POSITION_TABLE_NAME, "id = " + positionId, null); + Db.Delete(POSITION_TABLE_NAME, "id = " + positionId, null); } public Position GetPositionById(long positionId) { Position position = null; - var cursor = _db.Query(POSITION_TABLE_NAME, new[] { "id", "Ticker", "Shares", "PricePerShare" }, " id = " + positionId, null, null, null, null); + var cursor = Db.Query(POSITION_TABLE_NAME, new[] { "id", "Ticker", "Shares", "PricePerShare" }, " id = " + positionId, null, null, null, null); if (cursor.Count > 0) { while (cursor.MoveToNext()) @@ -126,7 +116,7 @@ namespace MonoStockPortfolio.Core.PortfolioRepositories { var list = new List<Position>(); - var cursor = _db.Query(POSITION_TABLE_NAME, new[] { "id", "Ticker", "Shares", "PricePerShare" }, " ContainingPortfolioID = " + portfolioId, null, null, null, null); + var cursor = Db.Query(POSITION_TABLE_NAME, new[] { "id", "Ticker", "Shares", "PricePerShare" }, " ContainingPortfolioID = " + portfolioId, null, null, null, null); if (cursor.Count > 0) { while (cursor.MoveToNext()) @@ -157,23 +147,23 @@ namespace MonoStockPortfolio.Core.PortfolioRepositories private void UpdateExistingPortfolio(Portfolio portfolio) { var portfolioID = portfolio.ID ?? -1; - Log.E("UpdateExistingPortfolio", "Portfolios updated: " + _db.Update(PORTFOLIO_TABLE_NAME, GetPortfolioContentValues(portfolio), "id = " + portfolioID, null)); + Log.E("UpdateExistingPortfolio", "Portfolios updated: " + Db.Update(PORTFOLIO_TABLE_NAME, GetPortfolioContentValues(portfolio), "id = " + portfolioID, null)); } private void InsertNewPortfolio(Portfolio portfolio) { - Log.E("InsertNewPortfolio", "Portfolios inserted: " + _db.Insert(PORTFOLIO_TABLE_NAME, null, GetPortfolioContentValues(portfolio))); + Log.E("InsertNewPortfolio", "Portfolios inserted: " + Db.Insert(PORTFOLIO_TABLE_NAME, null, GetPortfolioContentValues(portfolio))); } private void UpdateExistingPosition(Position position) { var positionID = position.ID ?? -1; - Log.E("UpdateExistingPosition", "Positions updated: " + _db.Update(POSITION_TABLE_NAME, GetPositionContentValues(position), "id = " + positionID, null)); + Log.E("UpdateExistingPosition", "Positions updated: " + Db.Update(POSITION_TABLE_NAME, GetPositionContentValues(position), "id = " + positionID, null)); } private void InsertNewPosition(Position position) { - Log.E("InsertNewPosition", "Positions inserted: " + _db.Insert(POSITION_TABLE_NAME, null, GetPositionContentValues(position))); + Log.E("InsertNewPosition", "Positions inserted: " + Db.Insert(POSITION_TABLE_NAME, null, GetPositionContentValues(position))); } private static ContentValues GetPortfolioContentValues(Portfolio portfolio) @@ -192,41 +182,5 @@ namespace MonoStockPortfolio.Core.PortfolioRepositories positionValues.Put("ContainingPortfolioID", position.ContainingPortfolioID); return positionValues; } - - - - - - - - - private class OpenHelper : SQLiteOpenHelper - { - public OpenHelper(Context context, string name, SQLiteDatabase.ICursorFactory factory, int version) - : base(context, name, factory, version) - { - } - - public override void OnCreate(SQLiteDatabase db) - { - db.ExecSQL("CREATE TABLE " + PORTFOLIO_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT)"); - db.ExecSQL("CREATE TABLE " + POSITION_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, Ticker TEXT, Shares REAL, PricePerShare REAL, ContainingPortfolioID INT)"); - - db.ExecSQL("INSERT INTO " + PORTFOLIO_TABLE_NAME + " (Name) VALUES ('Sample portfolio')"); - db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('GOOG', '500', '593.97', 1)"); - db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('AMZN', '500', '180.00', 1)"); - db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('AAPL', '500', '322.56', 1)"); - db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('MSFT', '500', '27.91', 1)"); - db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('NOVL', '500', '5.92', 1)"); - db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('S', '500', '4.23', 1)"); - db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('VZ', '500', '35.78', 1)"); - db.ExecSQL("INSERT INTO " + POSITION_TABLE_NAME + " (Ticker, Shares, PricePerShare, ContainingPortfolioID) VALUES ('T', '500', '29.38', 1)"); - } - - public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) - { - Log.W("Upgrade", "Nothing to upgrade"); - } - } } } \ No newline at end of file diff --git a/MonoStockPortfolio.Entities/StockDataItem.cs b/MonoStockPortfolio.Entities/StockDataItem.cs index 929dd94..f1020d5 100644 --- a/MonoStockPortfolio.Entities/StockDataItem.cs +++ b/MonoStockPortfolio.Entities/StockDataItem.cs @@ -3,22 +3,22 @@ namespace MonoStockPortfolio.Entities public enum StockDataItem { [StringValue("Change")] - Change, + Change = 0, [StringValue("Gain/Loss")] - GainLoss, + GainLoss = 1, [StringValue("Ticker")] - Ticker, + Ticker = 2, [StringValue("Time")] - Time, + Time = 3, [StringValue("Volume")] - Volume, + Volume = 4, [StringValue("Price")] - LastTradePrice, + LastTradePrice = 5, [StringValue("Price-RT")] - RealTimeLastTradeWithTime, + RealTimeLastTradeWithTime = 6, [StringValue("Change-RT")] - ChangeRealTime, + ChangeRealTime = 7, [StringValue("Gain/Loss-RT")] - GainLossRealTime + GainLossRealTime = 8 } } \ No newline at end of file